假设我们有以下内容:
function Super() {
// init code
}
function Sub() {
Super.call(this);
// other init code
}
Sub.prototype = new Super();
var sub = new Sub();
然后,在我们ocde的其他部分,我们可以使用以下任一方法来检查关系:
sub instanceof Super;
或
Super.prototype.isPrototypeOf( sub )
无论哪种方式,我们都需要同时拥有对象(sub)和父构造函数(Super)。那么,你有没有理由使用其中一个?还有其他一些区别更明确的情况吗?
我已经仔细阅读了2464426,但没有找到足够具体的答案。
答案 0 :(得分:33)
想象一下,在代码中不使用构造函数,而是使用Object.create
生成具有特定原型的对象。您的程序可能被架构为根本不使用构造函数:
var superProto = {
// some super properties
}
var subProto = Object.create(superProto);
subProto.someProp = 5;
var sub = Object.create(subProto);
console.log(superProto.isPrototypeOf(sub)); // true
console.log(sub instanceof superProto); // TypeError
此处,您没有与instanceof
一起使用的构造函数。您只能使用subProto.isPrototypeOf(sub)
。
答案 1 :(得分:10)
使用构造函数时没什么区别。 instanceof
或许更清洁一点。但是当你不......时:
var human = {mortal: true}
var socrates = Object.create(human);
human.isPrototypeOf(socrates); //=> true
socrates instanceof human; //=> ERROR!
所以isPrototypeOf
更为通用。
答案 2 :(得分:1)
根据此MDN Ref:
isPrototypeOf()
与instanceof
运算符不同。在表达式object instanceof AFunction
中,对象原型链是根据AFunction.prototype
而不是AFunction
本身进行检查的。
答案 3 :(得分:0)
var neuesArray = Object.create(Array);
Array.isPrototypeOf(neuesArray); // true
neuesArray instanceof Array // false
neuesArray instanceof Object // true
Array.isArray(neuesArray); // false
Array.prototype.isPrototypeOf(neuesArray); // false
Object.prototype.isPrototypeOf(neuesArray); // true
你了解我的朋友:) - 很简单
答案 4 :(得分:0)
object instanceof constructor
var superProto = {}
// subProto.__proto__.__proto__ === superProto
var subProto = Object.create(superProto);
subProto.someProp = 5;
// sub.__proto__.__proto__ === subProto
var sub = Object.create(subProto);
console.log(superProto.isPrototypeOf(sub)); // true
console.log(sub instanceof superProto); // TypeError: Right-hand side of 'instanceof' is not callable
// helper utility to see if `o1` is
// related to (delegates to) `o2`
function isRelatedTo(o1, o2) {
function F(){}
F.prototype = o2;
// ensure the right-hand side of 'instanceof' is callable
return o1 instanceof F;
}
isRelatedTo( b, a );
TypeError:“ instanceof”的右侧不可调用
instanceof
需要右边的值可被调用,这意味着它必须是一个函数(MDN将其称为构造函数)
和instanceof
测试对象原型链中constructor.prototype
的存在。
但isPrototypeOf()
没有这样的限制。 instanceof
检查superProto.prototype
,而isPrototypeOf()
直接检查superProto
。