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
是一个对象字面量(可以根据需要进行更改)。
使用
new Person()
创建的每个实例都有一个
__proto__
属性,它指向
Person.prototype
。这是用于查找特定对象的属性的链条。
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__
链接。在 Object.prototype
中,__proto__
指向 null
,链接到此结束。
任何对象都可以通过其由 __proto__
链接连接的原型链访问其原型链中的所有属性,这是原型继承的基础。
__proto__
不是访问原型链的标准方式,标准但类似的方法是使用 Object.getPrototypeOf(obj)
。
下面的代码演示了 instanceof
运算符:
当一个对象是某个 Class 的实例时,即如果该对象的原型链中存在 Class.prototype
,则 object instanceof Class
运算符返回 true
,进而表示该对象是该 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。
__proto__
е’Њconstructor.prototype
пјџ - Bergi