instanceof - Stoyan Stefanov在面向对象的javascript中的javascript不一致

时间:2013-12-12 20:17:33

标签: javascript instanceof

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 

Book excerpt

Google Chrome output

2 个答案:

答案 0 :(得分:3)

如果那是书的内容,那么这本书  是不正确的。 (并在Amazon.com中搜索书籍内容确认错误。)

您在Google Chrome中获得的true结果是正确的结果。

虽然h对象继承自.prototype函数上的Hero,但.prototype继承自.prototype函数上的Object 。这意味着h继承了Hero.prototypeObject.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);
}