javascript - new vs object create给出不同的结果OO javascript

标签 javascript oop constructor object-literal

我正在处理一个点亮的数据对象,然后尝试创建一个新对象来更改该实例的数据属性中的属性,这是来自 jsbin 的一些测试代码

data = {
  innerData : 1 
}

-------------

'This works :-)'

construct = function(d){
  this.data = Object.create(d);
};

construct.prototype.c = function(n){
  this.data.innerData  =  n;
};

construct.prototype.d = function(){
   console.log(this.data.innerData)
};

--------------

'This does not :-{'

construct = {
  data : Object.create(data),
  changeData : function(n){
    this.data.innerData  =  n;
  },
  showData:function(){
    console.log(this.data.innerData)
  }
}

--------------

newInst = Object.create(construct);
newInst.changeData(5);
newInst.showData();

newInst2 = Object.create(construct);
newInst2showData();

当我使用构造函数/原型(prototype)函数运行它时,它可以工作并且控制台输出 5,2

当我使用对象文字运行它时,控制台输出 5,5 我猜想当我创建第一个实例时它会更改实际数据对象而不是构造对象实例的数据属性。

如果有人能深入解释为什么会发生这种情况,那将会很有帮助,因为我使用 OOJS 的时间并不长

更新:

所以我尝试合并我从答案中发现有用的内容,然后我想出了这个....

data = {
  innerData : 1 
}

function construct(d){
  return {
    data : Object.create(d),
    changeData : function(n){
      this.data.innerData  =  n;
    },
    showData : function(){
      console.log(this.data.innerData)
    }
  }
}

build = function(){
 return(new construct(data));
}

newInst = build();
newInst.changeData(5);
newInst.showData();

newInst2 = build();
newInst2.showData();

最佳答案

鉴于我们对继承的了解,以下内容实际上做了什么

this.data.innerData  =  n;

thisObject.create(construct) 的结果?

  1. this 没有自己的属性 data,所以在继承的属性中查找。
  2. 好的,我们找到了一个data === Object.getPrototypeOf(this).data,称之为d
  3. 接下来将dinnerData设置为n

所以最终的实际结果是 innerData 属性已设置在 prototype 的引用上,而不是新的 Object.

为什么会这样?因为如果您有 o = {} 并尝试执行 o.foo.bar,您会得到一个 TypeError: Cannot read property 'bar' of undefined,因此为了不抛出错误,它必须访问一个定义的对象

var proto = {foo: {bar: 'fizz'}},
    obj = Object.create(proto);
obj.foo.bar = 'buzz';
proto.foo.bar; // "buzz" (i.e. NOT "fizz" anymore)
// and
obj.foo === Object.getPrototypeOf(obj).foo; // true

关于javascript - new vs object create给出不同的结果OO javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20940908/

相关文章:

javascript - React中使用localstorage一次显示组件的方法

javascript - 使用 jQuery 提交按钮在 IE9 和 FF9 中不起作用

php - 如何向 CodeIgniter 添加自动加载功能?

php - 如何在php中使用class(oops)在php中创建mysql表?

java - 为什么 Java 构造函数必须是 public 或 protected 才能将类扩展到其包之​​外?

java - 关于Java中类成员的问题

javascript - 在 .js 文件中获取 Angular 环境

JavaScript 无法解析为 Number

java - 枚举是否违反开放/封闭原则 Java?

c++ - 默认构造函数被误解为函数名称