Pac*_*ier 15 javascript ecmascript-5
此页面说明:
注意:isPrototypeOf与instanceof运算符不同.在表达式对象instanceof AFunction中,对象原型链将针对AFunction.prototype进行检查,而不是针对AFunction本身
好吧,我真的没有得到他们想要告诉我们的东西.object instanceof AFunction
与`AFunction.prototype.isPrototypeOf(object)不完全相同?或者我错了?
为什么我们需要它isPrototypeOf
呢?
如果我需要做的话p.isPrototypeOf(o)
,我不能这样做o instanceof p.constructor
吗?
另外,在p.isPrototypeOf(o)
功能上等同于p===Object.getPrototypeOf(o)
?
Mat*_*all 15
对象构造函数是时髦的东西.从这个答案:
正如Pointy 在他的回答中指出的那样
"constructor"属性是对创建对象原型的函数的引用,而不是对象本身.
解决这个问题的常用方法是
constructor
在分配对象之后扩充对象的prototype 属性prototype
.
对象的构造函数不是只读的,这就是为什么可以这样做的原因.我可以为p.constructor
after p
创建任何值,这将完全打破使用
o instanceof p.constructor
Run Code Online (Sandbox Code Playgroud)
代替
p.isPrototypeOf(o)
Run Code Online (Sandbox Code Playgroud)
编辑重新:OP编辑
另外,在
p.isPrototypeOf(o)
功能上等同于p===Object.getPrototypeOf(o)
?
那些比你原来的问题更相似,除了Object.getPrototypeOf
直到JavaScript 1.8.1才引入的事实?见John Resig -Object.getPrototypeOf
.也许更相关,这两个功能在规格上有所不同!(警告,PDF链接)
我认为这里最重要的区别是isPrototypeOf方法允许您检查对象是否直接从另一个对象继承.考虑以下:
var t = new Object();
var f = new Object();
var c = Object.create(t);
c instanceof f.constructor; // true
c instanceof t.constructor; // true
f.isPrototypeOf(c); // false
t.isPrototypeOf(c); // true
Run Code Online (Sandbox Code Playgroud)
如您所见,构造函数只是实例化对象的函数.不是实现说明符.因此,如果t.y = function(){ return true; }
和f.y = function(){ return false; }
我需要检查c
它将通过它的原型链返回适当的实现,那instanceof
将无济于事.
归档时间: |
|
查看次数: |
4965 次 |
最近记录: |