在MDN上,他们说明了以下内容:
属性是类中包含的变量;每个实例 对象具有这些属性。 应在原型中设置属性 属性类(函数)以便继承正常工作。
看看我设置为粗体的部分,我认为这意味着:
myClass.prototype.newProperty = ...
但是他们的例子显示了以下内容:
function Person(firstName) {
this.firstName = firstName;
console.log('Person instantiated');
}
var person1 = new Person('Alice');
var person2 = new Person('Bob');
// Show the firstName properties of the objects
console.log('person1 is ' + person1.firstName); // logs "person1 is Alice"
console.log('person2 is ' + person2.firstName); // logs "person2 is Bob"
在他们的示例中,他们正在添加属性" firstName'直接使用'这个'直接到班级/功能。
这是否意味着:
a)函数声明是原型吗?即myClass是原型,它还有一个属性原型,默认情况下设置为Object?
b)使用'这个。'在函数声明中确实将属性添加到myClass.prototype
修改:更新了标题
答案 0 :(得分:2)
JavaScript 没有类,停止在类中思考,因为这不适用于JavaScript(是的,即使使用ES6 class
语法,它只是糖,还有JavaScript中的实际类。)
通过将属性添加到对象的原型,您可以确保 以及具有相同原型的任何其他对象 将共享这个属性,这意味着他们都拥有它,但这也意味着如果你在一个上改变它,它将随着它们全部改变。糟糕。
使用new
关键字创建新对象非常简单:
this
作为新创建的对象调用构造函数。因此,向对象的原型添加属性将使它在同一构造函数的所有实例之间共享,而在构造函数中将其添加到this
将仅在此特定实例上使用它。因为它是在构造函数中设置的,所以假设所有实例都包含该变量是安全的,尽管它不会与所有其他实例共享。
当您调用JavaScript属性时,引擎将在以下方面查找它:
this
)因此,在您的Person示例中,查找链将如下所示:
this > Person.prototype > Object.prototype
构造函数的将如下所示:
this > Person.prototype > Function.prototype > Object.prototype
Person是一个函数,因此它的原型继承自Function.prototype
,类似地,任何函数都是Object。
那么就你的具体问题而言:
this
在此实例上应用该属性,而prototype
在所有实例之间共享。