首页 > isPrototypeOf()方法的含义?

isPrototypeOf()方法的含义?

JavaScriptJavaScript高级程序设计148页这样描述指针[[prototype]]:

当构造函数创建一个新实例后,该实例内部包含一个指针(内部属性),指向构造函数的原型.ECMA-262第五版管这个指针叫做[[prototype]].虽然在脚本中没有标准的方式访问它,但在Firefox,Safari,Chrome中提供了(__proto__).

149页第一次出现,书中这样写道:

虽然在所有实现中都无法访问[[prototype]],但可以通过isPrototypeOf()方法来确定对象之间是否存在这种关系.从本质上讲,如果[[prototype]]指向调用isPrototypeOf()方法的对象,那么这个方法就返回true
那么看下面的代码

JavaScriptfunction SuperType() {
    this.property = true;
}
SuperType.prototype.getSuperValue = function() {
    return this;
};

function SubType() {
    this.subproperty = false;
}
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function() {
    return this.subproperty;
};
var instance = new SubType();
alert(SuperType.prototype.isPrototypeOf(instance)); // true
alert(instance.__proto__ == SuperType.prototype) // false

第一个alerttrue按照149页描述的,那么instance是指向SuperType.prototype的,可是我们这样测试的时候却alert出的是false,又表示instance[[prototype]]并不指向SuperType.prototype.这不矛盾吗?


当构造函数创建一个新实例后,该实例内部包含一个指针(内部属性),指向构造函数的原型

你通过

var instance = new SubType();

创造了SubType的实例instance

instance.__proto__ //SuperType {property: true, getSu...    
instance           //SubType   {subproperty: false, property: true...

所以

instance.__proto__           === SubType.prototype   // true 
instance.__proto__.__proto__ === SuperType.prototype // true

这种想象叫做原型链。
举个例子:你去一个古老的山村家族找一个人,你先问孩子辈的人是否认识,可能他们太年轻,不认识;于是你去问他们的父母,是否认识,可能他们也不认识;然后你就要问他们的爷爷奶奶,是否认识。。。

js会顺着原型链向上寻找,会有两种结果:
- 找到了,返回或修改
- 没找到,返回undefined


isPrototypeOf和proto不等价,那书上也说了,可以通过isPrototypeOf()方法来确定对象之间是否存在这种关系.

这个关系就是原型链的关系,isPrototypeOf是判断a是否存在于b的原型链这么一个关系,所以是这样

javascriptinstance.__proto__ === SubType.prototype

instance.__proto__.isPrototypeOf(instance)

SubType.prototype.__proto__  === SuperType.prototype
instance.__proto__.__proto__ === SuperType.prototype

instance.__proto__.__proto__.isPrototypeOf(instance)

明白了么?这个原型链一直往上面,都在instance的原型链里,所以都是true。

【热门文章】
【热门文章】