prototype 属性是在声明函数时创建的。
例如:
function Person(dob){
this.dob = dob
};
Person.prototype一旦你声明了上面的函数,属性就会在内部创建。许多属性可以添加到Person.prototype由Person使用创建的实例共享的new 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 个对象可以调用as 、 的age方法。Person.prototypeperson1.ageperson2.age
在您的问题的上图中,您可以看到它Foo是 a Function Object,因此它有一个__proto__指向 的链接,而Function.prototype后者又是 的一个实例Object并具有__proto__指向 的链接Object.prototype。proto 链接在此处结束__proto__,Object.prototype指向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)如果对象是类的实例,则返回true。