【问题标题】:JavaScript: instanceof operator unexpected resultJavaScript:instanceof 运算符意外结果
【发布时间】:2016-08-31 23:06:26
【问题描述】:

我最近为自己发现了原型,很乐意在解决这个问题时得到一些帮助:

代码示例1:

    "use strict";

    var Car = function(loc) {
        var obj = Object.create(Car.prototype);
        obj.loc = loc;
        return obj;
    };

    Car.prototype.move = function() {
            this.loc++;
            return this.loc;
    };

    var bmw = Car(6);

    console.log( bmw instanceof Car );

代码示例2:

    "use strict";

    var Car = {
        "makeCar": function(loc) {
            var obj = Object.create(Car.prototype);
            obj.loc = loc;
            return obj;
        },
        "prototype": {
            "move": function() {
                this.loc++;
                return this.loc;
            }
        }
    };

    var bmw = Car.makeCar(6);

    console.log( bmw instanceof Car.makeCar );

我写了示例 2,因为我想将 Car 对象的方法保留在对象本身内。我不确定它是否可以完成,但到目前为止它正在工作,除了“instanceof”运算符。

在第一个示例中,它将记录“true”,但在第二个示例中,它将记录“false”,我不知道我错在哪里,所以请指望您的帮助,谢谢。

【问题讨论】:

  • Car.makeCarfunction 而不是 Car 对象。
  • instanceof 测试对象的原型链是否包含构造函数的原型。 bmw 的原型链包含 Car,而不是 Car.makeCar
  • bmw instanceof Car 仍然有效,因为您仍在创建要从 Car.prototype 继承的实例
  • 我对示例 2 的初始测试是 console.log( bmw instanceof Car );但在这种情况下,我有一个错误:“未捕获的 TypeError:'instanceof' 的右侧不可调用”。
  • @Mike:哦,对了,Car 需要一个构造函数才能工作。 Car.makeCar 不是构造函数,并且在其 .prototype 属性上没有实例的原型,因此这也不起作用。

标签: javascript prototype instanceof


【解决方案1】:

console.log( bmw instanceof Car.makeCar ); 产生false

...因为Car.makeCar 在其.prototype 属性上没有实例的原型。 instanceof 表达式等效于 Car.makeCar.prototype.isPrototypeOf(bmw)。要使其工作,您需要设置

Car.makeCar.prototype = Car.prototype;

但这很奇怪。只要保持标准模式。如果你想与构造函数一起在一个结构单元中声明你的方法,请将所有内容包装在 IEFE like here 中,或者只使用 ES6 类

【讨论】:

  • 哇,在 7 秒内立即接受!这很难被击败:-)
猜你喜欢
  • 2013-01-12
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2014-07-01
  • 1970-01-01
  • 2012-04-03
  • 2012-04-09
相关资源
最近更新 更多