这个图再次表明每个对象都有一个原型。构造函数Foo也有自己的
__proto__
,即Function.prototype,它反过来也通过其__proto__
属性再次引用Object.prototype。因此,重复一遍,Foo.prototype只是Foo的一个显式属性,它引用b和c对象的原型。
var b = new Foo(20);
var c = new Foo(30);
__proto__
和prototype
之间的区别是什么
该图取自dmitrysoshnikov.com。
注意:现在有上述2010年文章的。
发布于 2012-04-01 05:16:59
__proto__
是在查找链中用于解析方法等的实际对象。prototype
是在使用new
创建对象时用于构建__proto__
的对象
( new Foo ).__proto__ === Foo.prototype;
( new Foo ).prototype === undefined;
发布于 2012-04-01 05:20:02
prototype
是函数对象的属性。它是由该函数构造的对象的原型。
__proto__
是对象的内部属性,指向其原型。尽管事实上的标准__proto__
更快,但当前标准提供了等效的Object.getPrototypeOf(obj)
方法。
您可以通过将函数的instanceof
与对象的prototype
链进行比较来查找__proto__
关系,并可以通过更改prototype
来打破这些关系。
function Point(x, y) {
this.x = x;
this.y = y;
}
var myPoint = new Point();
// the following are all true
myPoint.__proto__ == Point.prototype
myPoint.__proto__.__proto__ == Object.prototype
myPoint instanceof Point;
myPoint instanceof Object;
这里的Point
是一个构造函数,它以过程化的方式构建一个对象(数据结构)。myPoint
是由Point()
构造的对象,因此Point.prototype
会在此时保存到myPoint.__proto__
。
发布于 2013-08-10 23:27:33
prototype
属性在声明函数时创建。
例如:
function Person(dob){
this.dob = dob
};
一旦声明了上面的函数,就会在内部创建Person.prototype
属性。可以将许多属性添加到Person.prototype
中,这些属性由使用new Person()
创建的Person
实例共享。
// adds a new method age to the Person.prototype Object.
Person.prototype.age = function(){return date-dob};
值得注意的是,默认情况下,Person.prototype
是一个Object
文本(可以根据需要进行更改)。
使用new Person()
创建的每个实例都有一个指向Person.prototype
的__proto__
属性。这是用于遍历以查找特定对象的属性的链。
var person1 = new Person(somedate);
var person2 = new Person(somedate);
创建两个Person
实例,这两个对象可以调用Person.prototype
的age
方法作为person1.age
,person2.age
。
在您的问题的上图中,您可以看到Foo
是一个Function Object
,因此它有一个指向Function.prototype
的__proto__
链接,而Function.prototype
又是Object
的一个实例,并且有一个指向Object.prototype
的__proto__
链接。proto链接在这里结束,Object.prototype
中的__proto__
指向null
。
任何对象都可以访问由__proto__
链接的原始链中的所有属性,从而形成原型继承的基础。
__proto__
不是访问原型链的标准方式,标准但类似的方法是使用Object.getPrototypeOf(obj)
。
下面的instanceof
运算符代码提供了更好的理解:
当对象是类的实例时,对象instanceof
类运算符返回true
,更具体地说,如果在该对象的原始链中找到Class.prototype
,则该对象是该类的实例。
function instanceOf(Func){
var obj = this;
while(obj !== null){
if(Object.getPrototypeOf(obj) === Func.prototype)
return true;
obj = Object.getPrototypeOf(obj);
}
return false;
}
上面的方法可以调用为:instanceOf.call(object, Class)
,如果object是类的实例,则返回true。
https://stackoverflow.com/questions/9959727
复制相似问题