【问题标题】:JS About prototype inheritanceJS 关于原型继承
【发布时间】:2022-10-13 06:06:55
【问题描述】:

为什么这段代码会返回两次bar,而不是foo,然后是bar

function Person(name) {
  if (name) this.options.name = name;
}

Person.prototype.options = {
  name: "Default name"
};

var foo = new Person("foo");
var bar = new Person("bar");

console.log(foo.options.name);
console.log(bar.options.name);

这样做是因为参考,你们能解释一下吗

【问题讨论】:

  • this.options 指原型中的options 对象,这是Person 的所有实例的公共对象。像这样:this.name = name || this.options.name;,这样您就可以从选项中读取默认名称,并为每个实例指定一个单独的名称(如果它通过了)。
  • 提示:在脚本末尾运行:console.log( "Object.is: %o", Object.is( foo.options, bar.options ) ); - 它将打印"Object.is: true
  • options = { name: "Default name" }; foo = options; bar = options; foo.name = "foo"; bar.name = "bar"; 基本上和你的代码一样。修改同一个对象会导致...修改同一个对象。
  • @VLAZ我认为OP希望在Person构造函数运行时复制原型对象(a-la Object.assign)。我承认我已经忘记了如何使用 prototype 这样的实例分享状态...

标签: javascript reference prototype


【解决方案1】:

感谢所有回答这个问题的人。

1- foo 和 bar 都指向同一个对象,称为options

2- 它们指向相同的传递值name

3- foo 和 bar 都是对象,所以它们是引用。

4-并且它们包含名为options 的对象,并且还引用了该对象。

5-因此,当我们在 foo 的任何一个中更改 options 对象中的 name 值时,它将在所有创建的对象中更改为 options 对象 namePerson 函数。

我认为这是答案

【讨论】:

    【解决方案2】:

    因为当您实例化 foo 和 bar 时,它会生成一个浅拷贝Person.prototype.options 对象。

    function Person(name) {
      if (name) this.options.name = name;
    }
    
    Person.prototype.options = {
      name: "Default name"
    };
    
    var foo = new Person("foo");
    var bar = new Person("bar");
    
    // are foo.options and bar.options pointing to the same options object?
    console.log(foo.options===bar.options)

    如您所见,foo.options===bar.options 返回 true。

    【讨论】:

      猜你喜欢
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多