javascript - 构造函数的实例可以继承原型(prototype)桶中未定义的成员吗?

标签 javascript oop constructor prototype

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/

相关文章:

javascript - jqGrid - 如何从本地数据中删除行?

javascript - 如何找出我在脚本中使用了哪些 jQuery 函数?

python - PyGame - 获取加载图像的大小

types - 在 Julia 中构造具有相关字段的类型

javascript - 如何在另一个方法中使用从一个方法内的嵌套函数返回的值?

C++参数化构造函数在模板化类中

javascript - jQuery 代码不适用于 wordpress 网站

javascript - WebAssembly 中是否有 Javascript 运行时

oop - MyObject.DoSomething() 与 MyService.DoSomething(MyObject)

java - 面向对象的安全编程