构造函数的实例是否可以继承未在原型存储桶中定义的成员?

问题描述 投票:0回答:2

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属性之外定义的。

javascript oop constructor prototype
2个回答
1
投票

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

然而,在给出的例子的情况下,混淆产生于相信name是遗传的 - 它不是。

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

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


1
投票

该物业和name和方法greeting都以不同的方式提供给person1

  1. 由于name运营商,person1可用于new
  2. 由于greetingperson1可用于prototype

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

© www.soinside.com 2019 - 2024. All rights reserved.