Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构造函数的实例可以继承未在原型桶中定义的成员吗?

构造函数的实例可以继承未在原型桶中定义的成员吗?
EN

Stack Overflow用户
提问于 2019-02-21 19:00:44
回答 2查看 52关注 0票数 0

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

如果我有如下构造函数:

代码语言:javascript
运行
AI代码解释
复制
function Person(name) {
this.name = name;
}

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

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

代码语言:javascript
运行
AI代码解释
复制
let person1 = new Person("Foo");

person1可以访问person1.nameperson1.greeting(),尽管name属性是在prototype属性之外定义的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-21 19:23:15

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

然而,在给出的例子中,在相信name是继承的--它不是这样的情况下,出现了混淆。

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

有关更多信息,请研究JavaScript继承是如何工作的,特别是Object.prototype.hasOwnProperty方法是如何工作的。

票数 1
EN

Stack Overflow用户

发布于 2019-02-21 19:25:45

属性和name以及方法greeting都以不同的方式对person1可用。

  1. 由于name运算符的存在,person1可以使用new
  2. 由于greeting的存在,person1可以使用prototype

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54819450

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档