【问题标题】:Can instances of a constructor inherit members that are not defined within the prototype bucket?构造函数的实例可以继承原型桶中未定义的成员吗?
【发布时间】:2019-07-16 02:20:03
【问题描述】:

MDN 解释说构造函数的实例只继承constructor.prototype 属性内的成员,而不继承它之外的任何东西。例如,Object.prototype.watch() 将被继承到它的实例,而不是Object.keys();

如果我有如下构造函数:

function Person(name) {
this.name = name;
}

Person.prototype.greeting = function() {
 alert("Hi!");
}

name 属性不在原型属性中,但 greeting() 方法在。但是,如果我这样创建一个实例:

let person1 = new Person("Foo");

person1 能够访问 person1.nameperson1.greeting() 两者,即使 name 属性是在原型属性之外定义的。

【问题讨论】:

  • Person.prototype.greeting()。我不知道,您缺少什么?顺便说一句,你有一个语法错误。应该是Person.prototype.greeting = function () { ... }

标签: javascript oop constructor prototype


【解决方案1】:

技术上答案是肯定的:一个实例可以继承其构造函数的原型对象属性,以及原型对象继承的任何属性。这就是“原型链”的广义含义”。

然而,在给出的示例的情况下,混淆了相信name 是继承的——它不是。

除了从其原型链继承属性外,对象还可以具有本地或“自己的”属性。忽略 getter 和 setter 的更高级用法,继承的属性是只读的:如果您向它们写入,写入的值将保存在一个“自己的”属性中,该属性创建用于本地保存写入的值 - 这意味着写入的值会隐藏继承的值而不覆盖它到位。

如需更多信息,请研究 JavaScript 继承的工作原理,尤其是 Object.prototype.hasOwnProperty 方法的作用。

【讨论】:

    【解决方案2】:

    person1 可以通过不同的方式使用属性和name 和方法greeting

    1. nameperson1 可用,因为 new 运营商
    2. greetingperson1 可用,因为 prototype

    当使用new 运算符时,它总是返回Object。并且对象有自己的属性。 name 是 Object 的属性。

    【讨论】:

      猜你喜欢
      • 2020-07-11
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2023-03-18
      • 2015-03-21
      相关资源
      最近更新 更多