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属性之外定义的。
发布于 2019-02-21 19:23:15
从技术上讲,答案是肯定的:实例可以继承其构造函数的prototype对象属性,以及prototype对象继承的任何属性。这就是“原型链”的广义含义。
然而,在给出的例子中,在相信name
是继承的--它不是这样的情况下,出现了混淆。
对象除了从它们的原型链继承属性之外,还可以具有本地或“自己的”属性。忽略getter和setter更高级的用法,继承的属性只会被读取:如果您向它们写入写入的值,则将写入的值保存在一个为本地保存所写的值而创建的“属于”属性中--这意味着写入的值在不覆盖它的情况下隐藏了继承的值。
有关更多信息,请研究JavaScript继承是如何工作的,特别是Object.prototype.hasOwnProperty
方法是如何工作的。
发布于 2019-02-21 19:25:45
属性和name
以及方法greeting
都以不同的方式对person1
可用。
name
运算符的存在,person1
可以使用new
。greeting
的存在,person1
可以使用prototype
当使用new
运算符时,它总是返回一个Object
。对象有它自己的属性。name
是对象的属性。
https://stackoverflow.com/questions/54819450
复制