MDN解释了构造函数的实例仅继承 constructor.prototype 属性内的成员,但不继承其外部的任何成员。例如,Object.prototype.watch()
将被继承到其实例,但 Object.keys();
不会。
如果我有一个如下的构造函数:
function Person(name) {
this.name = name;
}
Person.prototype.greeting = function() {
alert("Hi!");
}
name 属性不在prototype 属性内,但greeting() 方法在。但是,如果我这样创建一个实例:
let person1 = new Person("Foo");
person1 能够访问 person1.name
以及 person1.greeting()
,即使 name 属性是在原型(prototype)属性之外定义的。
最佳答案
从技术上讲,答案是肯定的:实例可以从其构造函数的原型(prototype)对象属性继承,以及原型(prototype)对象继承的任何属性。这就是“原型(prototype)链”的广义含义”。
然而,在给出的示例中,相信 name
是继承的会产生困惑 - 事实并非如此。
除了从原型(prototype)链继承属性之外,对象还可以具有本地或“自己的”属性。忽略 getter 和 setter 的更高级用法,继承的属性是只读的:如果您写入它们,写入的值将保存在创建用于本地保存写入的值的“自己的”属性中 - 这意味着写入的值会隐藏继承的值而不覆盖它到位。
有关详细信息,请研究 JavaScript 继承的工作原理,特别是 Object.prototype.hasOwnProperty
方法的作用。
关于javascript - 构造函数的实例可以继承原型(prototype)桶中未定义的成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54819450/