【问题标题】:OOP inheritance and objects instacesOOP 继承和对象实例
【发布时间】:2015-01-27 10:30:21
【问题描述】:

我研究了 JavaScript 中的继承和 OOPS。我创建了“A”对象和“B”对象,并将“B”的所有属性继承到“A”。

当我使用“instanceof”检查新创建的对象实例时,我发现两个对象都是真的。
但我只使用“B”构造函数创建了对象。

function A(){
    this.a = "test1",
    this.b = "test2"
}

function B(){
    this.c = "test3",
    this.d = "test4"
}

B.prototype = new A();

var userObj = new B();

console.log(userObj instanceof B); // true
console.log(userObj instanceof A); // true, How this can be true?

【问题讨论】:

    标签: javascript oop inheritance


    【解决方案1】:

    在 JavaScript 中,继承是基于原型的。这意味着没有课程。相反,一个对象继承自另一个对象。

    你在这里所做的是,对象 B 继承自对象 A 是因为:

    B.prototype = new A();
    

    所以,现在,userObj(对象 B 的实例)当然变成了对象 A 的实例,(这就是继承的全部意义,对吧?)

    原来如此

    console.log(userObj instanceof B); // true
    console.log(userObj instanceof A); //  Also true?
    

    【讨论】:

      【解决方案2】:

      原型对象有一个称为构造函数的内置属性。首先从 chorme 控制台查看此图像,然后再讨论

      在您的代码B.prototype = new A(); =>此语句将 B 的原型设置为 A 的实例。因此 B 的原型对象将其构造函数属性分配给 A();

      console.log(userObj.constructor // it will show A.But it is not true
      

      记住它不是userObj的构造函数。你得到的构造函数来自prototype obj。

      console.log(userObj instanceof A); // 真的,这怎么可能是真的?

      由于 userObj 是 B 的一个实例。而 B 继承自 A。所以 userObj 也是 A 的一个实例。但是您可以使用设置为 B 的构造函数属性来操作

      B.prototype.constructor=B;
      

      【讨论】:

        【解决方案3】:

        console.log(userObj instanceof A); 你一定会得到true。这符合 JavaScript 标准。

        当您创建一个继承A 的所有属性的B 对象时,该对象包含一个指向A's Prototype 的链接__proto__

        所以instanceof 将在对象B 的原型链中找到A's 构造函数。

        这就是它返回 true 的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-03
          • 1970-01-01
          • 1970-01-01
          • 2021-12-27
          • 2013-04-18
          • 2013-03-28
          相关资源
          最近更新 更多