在Stoyan Stefanov's book Object-Oriented javascript,第103页,他有以下内容。但是,当我尝试这个时,我得到h instanceof Object
的不同结果。我错过了什么,JS中有什么东西改变了,或者这是书中的错误。
>>> function Hero(){}
>>> var h = new Hero();
>>> var o = {};
>>> h instanceof Hero;
true
>>> h instanceof Object;
false //true in Google Chrome
>>> o instanceof Object;
true
答案 0 :(得分:3)
如果那是书的内容,那么这本书 是不正确的。 (并在Amazon.com中搜索书籍内容确认错误。)
您在Google Chrome中获得的true
结果是正确的结果。
虽然h
对象继承自.prototype
函数上的Hero
,但.prototype
继承自.prototype
函数上的Object
。这意味着h
继承了Hero.prototype
和Object.prototype
,并被视为两个构造函数的实例。
如果Hero.prototype
是一个没有从Object.prototype
继承的对象,那么它唯一的方法就是不存在。但在该示例中,它使用默认对象,因此它确实继承。
答案 1 :(得分:0)
使用instanceof运算符,您不会测试某些东西是否由某个构造函数创建,而是某些东西是否继承自某个对象(某个对象是否在某个原型链中)。 foo instanceof F与递归* Object.getPrototypeOf(foo) === F.prototype
var F = function() {};
var foo = new F();
foo instanceof F // true
Object.getPrototypeOf(foo) === F.prototype // true
F.prototype = {}; // changed the prototype of F
foo instanceof F // false
Object.getPrototypeOf(foo) === F.prototype // false
foo instanceof Object // true
Object.getPrototypeOf(Object.getPrototypeOf(foo)) === Object.prototype // true
考虑到这一点,很明显如果你不将函数的原型更改为不从Object.prototype继承的对象,那么使用该函数构造的所有实例都将继承自Object .prototype,所以它们将是Object的实例。
F.prototype = Object.create(null);
var bar = new F();
bar instanceof F // true
bar instanceof Object // false
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof
instanceof
垫片(仅用于理论目的,没有实际用途):
function instanceOf(object, constructor) {
if (!object) return false;
var object = Object.getPrototypeOf(object);
if (object === constructor.prototype) return true;
return instanceOf(object, constructor);
}