该图再次显示每个对象都有一个原型。构造函数 Foo 还具有自己的
__proto__
,即 Function.prototype,而该__proto__
又通过其__proto__
属性再次引用了 Object.prototype。因此,重复一遍,Foo.prototype 只是 Foo 的显式属性,它引用 b 和 c 对象的原型。
var b = new Foo(20);
var c = new Foo(30);
__proto__
和prototype
什么区别?
该图取自dmitrysoshnikov.com 。
__proto__
是在查找链用来解决方法,实际的对象等prototype
是用于构建对象__proto__
当你创建一个对象与new
:
( new Foo ).__proto__ === Foo.prototype;
( new Foo ).prototype === undefined;
prototype
是 Function 对象的属性。它是由该功能构造的对象的原型。
__proto__
是对象的内部属性,指向其原型。当前的标准提供了等效的Object.getPrototypeOf(O)
方法,尽管事实上标准__proto__
更快。
通过将函数的prototype
与对象的__proto__
链进行比较,可以找到instanceof
关系,并且可以通过更改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__
。
声明函数时创建原型属性。
例如:
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()
创建的每个实例都具有一个__proto__
属性,该属性指向Person.prototype
。这是用于遍历以查找特定对象的属性的链。
var person1 = new Person(somedate);
var person2 = new Person(somedate);
创建 2 个Person
实例,这 2 个对象可以将Person.prototype
age
方法称为person1.age
和person2.age
。
在上一个问题的图片中,您可以看到Foo
是一个Function Object
,因此它具有指向Function.prototype
的__proto__
链接,而__proto__
则是Object
的实例,并且具有指向Object.prototype
的__proto__
链接。 proto 链接在此处以Object.prototype
__proto__
指向null
。
任何对象都可以访问其通过__proto__
链接的原型链中的所有属性,从而构成原型继承的基础。
__proto__
不是访问原型链的标准方法,标准但相似的方法是使用Object.getPrototypeOf(obj)
。
下面的instanceof
运算符代码可提供更好的理解:
当对象是 Class 的实例时,对象instanceof
Class 运算符将返回true
,更具体地说,如果在该对象的原型链中找到Class.prototype
,则该对象就是该 Class 的实例。
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 是 Class 的实例,则返回 true。