在声明函数时创建Prototype属性。
例如:
function Person(dob){
this.dob = dob
};
的人。Prototype属性在声明上述函数后在内部创建。
可以向Person添加许多属性。由使用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);
创建2个Person实例,这2个对象可以调用Person的age方法。原型作为人物1。年龄,person2.age。
在你的问题的上图中,你可以看到Foo是一个函数对象,因此它有一个__proto__链接到函数。prototype是Object的一个实例,并且有一个指向Object.prototype的__proto__链接。原型链接在这里以对象中的__proto__结束。原型指向null。
任何对象都可以访问其原型链中的所有属性,通过__proto__链接,从而形成原型继承的基础。
__proto__不是访问原型链的标准方法,标准但类似的方法是使用Object.getPrototypeOf(obj)。
下面的instanceof操作符代码提供了更好的理解:
当一个对象是一个类的实例时,更具体地说,如果Class,则返回true。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。调用(object, Class),如果object是Class的实例则返回true。