gpt4 book ai didi

javascript - 为什么赋值影响实例而不影响原型(prototype)属性?

转载 作者:行者123 更新时间:2023-11-29 19:55:10 25 4
gpt4 key购买 nike

我每周都会参加这个聚会,讨论有效的 javascript:68 种方法这本书。

在第 36 条:仅在实例对象上存储实例状态,我们创建了以下示例来解释它。

function User() {}
User.prototype = {
hobbies: [], // should be instance state!
addHobby: function (x) {
this.hobbies.push(x);
}

};

我们实例化以下用户。

boy = new User();
// User {hobbies: Array[0], addHobby: function}
girl = new User();
// User {hobbies: Array[0], addHobby: function}
boy.addHobby("swimming");
girl.addHobby("running");
// undefined
boy.hobbies
// ["swimming", "running"]
girl.hobbies
// ["swimming", "running"]

如您所见,addHobby 函数会影响原型(prototype)级别的爱好。

现在,如果我将整个代码更改为

function User() {}
User.prototype = {
hobbies: [], // should be instance state!
addHobby: function (x) {
newArr = new Array(x);
this.hobbies = this.hobbies.concat(newArr);
}

};

boy = new User();
girl = new User();

boy.addHobby("swimming");
girl.addHobby("running");
boy.hobbies
//["swimming"]
girl.hobbies
//["running"]

我们知道原因是因为作业。我们正在寻找一个完整的解释,为什么 this.hobbies = this.hobbies.concat(newArr); 分配给实例级别而不是原型(prototype)级别,尽管在这两种情况下都使用术语 this。爱好被使用。

最佳答案

这就是语言的定义方式。 From the spec :

The production MemberExpression : MemberExpression [ Expression ] is evaluated as follows:

  1. 让 baseReference 成为评估 MemberExpression 的结果。
  2. 设 baseValue 为 GetValue(baseReference)。
  3. 让 propertyNameReference 成为计算 Expression 的结果。
  4. 让 propertyNameValue 为 GetValue(propertyNameReference)。
  5. 调用 CheckObjectCoercible(baseValue)。
  6. 令 propertyNameString 为 ToString(propertyNameValue)。
  7. 如果正在评估的句法产生式包含在严格模式代码中,则让 strict 为真,否则让 strict 为假。
  8. 返回一个类型为 Reference 的值,其基值为 baseValue,其引用名称为 propertyNameString,其严格模式标志为 strict。

Ecma moon 语言没有提及在对象原型(prototype)上查找属性。左值成员表达式总是引用直接涉及的基础对象的属性。

关于javascript - 为什么赋值影响实例而不影响原型(prototype)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16239641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com