prototype与__proto__区别

参考链接:http://blog.csdn.net/ligang2585116/article/details/53522741

      https://stackoverflow.com/questions/9959727/proto-vs-prototype-in-javascript

一:__proto__和prototype

     

参考下面的回答:

      

__proto__ is the actual object that is used in the lookup chain to resolve methods, etc. prototype is the object that is used to build __proto__ when you create an object with new:

( new Foo ).__proto__ === Foo.prototype
( new Foo ).prototype === undefined

The prototype is a property on a constructor function that sets what will become the __proto__ property on the constructed object.

就是说真正的原型链就是通过__proto__来连起来的。

比如下面的例子,animal通过__proto__-->f(){ [native code] }-->object-->null,,一路走到null

function animal(){}

var dog = new animal();

console.log(dog.prototype)  //undefined

console.log(dog.__proto__);  //constructor:f animal()
console.log(animal.prototype) //constructor:f animal()
console.log(animal.__proto__);  //f(){ [native code] }

console.log(animal.prototype === dog.__proto__); //true

console.log(animal.__proto__.__proto__); //Object

console.log(animal.__proto__.__proto__.__proto__);   //null
console.log(animal.prototype.prototype); //undefined
 

二:修改__proto__

上面直接修改__proto__是不安全的(这东西只是浏览器自己实现的一个属性),正确修改原型的方式像下面这样:

function inherits(Child, Parent) {
    var F = function () {};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
}

inherits(Child,Base);

现在可以使用ES6的Object.create 和 Object.setPrototypeOf来修改prototype

原文地址:https://www.cnblogs.com/johnzhu/p/7145008.html

时间: 2024-08-29 16:22:11

prototype与__proto__区别的相关文章

prototype和__proto__区别

prototype和__proto__分别是显式原型和隐式原型,直接上代码吧: function person(){ this.age = 12; } person.prototype; //Object let person1 = new person(); person1.__proto__; // Object person1.__proto__ == person.prototype; //true 可以看到显式原型和隐式原型是一样的~~

详解prototype与__proto__区别

Each constructor is a function that has a property named "prototype" that is used to implement prototype-based inheritance and shared properties. Every object created by a constructor has an implicit reference (called the object's prototype) to

在 JavaScript 中 prototype 和 __proto__ 有什么区别

本文主要讲三个 问题 prototype 和 proto function 和 object new 到底发生了什么 prototype 和 proto 首先我们说下在 JS 中,常常让我们感到困惑的地方,就是 prototype 和 __proto__ 到底是干嘛的 1. __proto__ 就是 Javascript中 所谓的原型 (这里,我们还是拿具体的例子来说明吧) function A (name) { // 这里是一个构造函数 thia.name = name } var Aobj

js深入学习-js prototype constructor属性区别

在很多js 插件中出现这两个属性的频率很高,我自己写插件时,也用到过,知道用,不知道具体的区别,今天研究了下, constructor 返回的是对象(类型的实例)的构造函数,通过prototype 添加的属性和方法不会返回. prototype 返回的是类型的原型,不会饭后构造函数部分. 实例如下: <html> <head> <script type="text/javascript">    var cat=function (name,sex)

简单认识prototype和__proto__,个人小结

首先说一下构造函数,定义构造函数就是在定义一个模版,其目的就是为了复用.每个构造函数都有一个prototype属性,指向自己的原型对象.每一个构造函数创建出来的对象都会链接到prototype这个属性中,那么原型的作用是什么?1.就是为了重复的代码进行复用,2.就是为了继承.对象原型中有的成员,那么对象也就有了.共有的属性放到原型里,特有的一般放到构造方法里,这样可以达到复用的效果. 例如: function Fn(name){ this.name = name; }; // 每一个对象会去找原

&lt;JavaScript&gt;constructor、prototype、__proto__和原型链

在看了网上很多相关的文章,很多都是懵逼看完,并不是说各位前辈们写得不好,而是说实在不容易在一两次阅读中理解透.我在阅读了一些文章后,自己整理总结和绘制了一些相关的图,个人认为会更容易接受和理解,所以分享在此.也因此以下的所有的理解和图解都是出于个人的理解,如果有错误的地方,请各位前辈务必见谅,并辛苦在下方提出和纠错,我实在担心自己不成熟的理论底子会误导了其余的小兄弟. 一开始,先说说为何这个知识点为什么理解起来这么乱 个人感觉原因有三: JS内函数即对象. Function对象和Object对象

轻松理解JS中的面向对象,顺便搞懂prototype和__proto__的原理介绍

这篇文章主要讲一下JS中面向对象以及 __proto__,ptototype和construcator,这几个概念都是相关的,所以一起讲了. 在讲这个之前我们先来说说类,了解面向对象的朋友应该都知道,如果我要定义一个通用的类型我可以使用类(class).比如在java中我们可以这样定义一个类: public class Puppy{ int puppyAge; public Puppy(age){ puppyAge = age; } public void say() { System.out.

理清javascript中prototype、__proto__、Object、Function的关系,更好地理解原型继承

本文参考了http://www.blogjava.net/heavensay/archive/2013/10/20/405440.html这篇文章,对其内容作了个简单总结,形成了几条简单的结论,让读者更容易记住prototype.__proto__.Object.Function之间的关系. 结论1:Object.prototype只是一个普通对象,它是js原型链的最顶端. (typeof Object.prototype) === object;//true Object.prototype.

prototype和__proto__

一.prototype和__proto__的概念 prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象.它是显示修改对象的原型的属性. __proto__是一个对象拥有的内置属性(请注意:prototype是函数的内置属性,__proto__是对象的内置属性),是JS内部使用寻找原型链的属性. 用chrome和FF都可以访问到对象的__proto__属性,IE不可以. 二.new 的过程 var Person = function(){}