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属性之外定义的。
从技术上讲,答案是肯定的:实例可以继承其构造函数的原型对象属性,以及原型对象继承的任何属性。这是“原型链”的一般含义。
然而,在给出的例子的情况下,混淆产生于相信name
是遗传的 - 它不是。
除了从原型链继承属性之外,对象还可以具有本地或“自有”属性。忽略getter和setter的更高级用法,继承的属性是只读的:如果你写入它们,写入的值保存在一个“own”属性中,该属性被创建为本地保存写入的值 - 这意味着写入的值会影响继承的值而不会覆盖它到位。
有关更多信息,请研究JavaScript继承的工作原理,特别是Object.prototype.hasOwnProperty
方法的功能。
该物业和name
和方法greeting
都以不同的方式提供给person1
。
name
运营商,person1
可用于new
greeting
,person1
可用于prototype
当使用new
运算符时,它总是返回Object
。对象有自己的属性。 name
是Object的财产。