JavaScriptJavaScript高级程序设计148页这样描述指针[[prototype]]:
当构造函数创建一个新实例后,该实例内部包含一个指针(内部属性),指向构造函数的原型.ECMA-262第五版管这个指针叫做[[prototype]]
.虽然在脚本中没有标准的方式访问它,但在Firefox,Safari,Chrome中提供了(__proto__)
.
149页第一次出现,书中这样写道:
虽然在所有实现中都无法访问[[prototype]]
,但可以通过isPrototypeOf()
方法来确定对象之间是否存在这种关系.从本质上讲,如果[[prototype]]
指向调用isPrototypeOf()
方法的对象,那么这个方法就返回true
那么看下面的代码
JavaScript
function 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
第一个alert
为true
按照149页
描述的,那么instance
是指向SuperType.prototype
的,可是我们这样测试的时候却alert
出的是false
,又表示instance
的[[prototype]]
并不指向SuperType.prototype
.这不矛盾吗?
isPrototypeOf和proto不等价,那书上也说了,可以通过isPrototypeOf()方法来确定对象之间是否存在这种关系.
这个关系就是原型链的关系,isPrototypeOf是判断a是否存在于b的原型链这么一个关系,所以是这样
明白了么?这个原型链一直往上面,都在instance的原型链里,所以都是true。