【问题标题】:pass object reference as function argument in javascript在javascript中将对象引用作为函数参数传递
【发布时间】:2017-01-09 09:01:13
【问题描述】:

这里我有一个简单的代码来了解Object.create() 的工作原理。在这里,我有一个公共对象用作原型,它是prototypeObjnewObj 是一个原型设置为prototypeObj 的对象。这里我有另一个名为session 的对象,它有一个名为anotherObj 的属性,anotherObjnewObj 具有相同的原型。但是向位于 anotherObj 原型中的名为 foo 的属性添加新值也会影响 newObj。为什么我会遇到这种行为?

代码:

var prototypeObj = {
  foo: [],
  addItemToFoo: function(add) {
    this.foo.push(add);
  }
}

function create(fooVal) {
  var myProto = Object.create(prototypeObj);
  myProto.foo = fooVal;
  return myProto;
}

var newObj = create([1, 2]); // initialized with [1,2]

session = {
  anotherObj: create(newObj.foo) // initialized with [1,2]
}

session.anotherObj.addItemToFoo(6); // pushed 6 to session.anotherObj.foo

console.log("newObj.foo is " + newObj.foo); // newObj also get 6 pushed to its foo property

console.log("anotherObj.foo is " + session.anotherObj.foo);

【问题讨论】:

    标签: javascript oop prototype


    【解决方案1】:

    foo 是一个数组,它通过引用起作用。

    anotherObj: create(newObj.foo)
    

    您在此处复制引用,因此您的旧对象和新对象都将具有相同的数组引用来插入元素。如果您想要不同的数组引用,您应该首先像这样复制它create(newObj.foo.slice())

    https://jsfiddle.net/x8ftnh82/

    【讨论】:

    • @AL-zami 现在呢?
    • @AL-zami 很棒 :),请注意,例如 integerstring 不会发生这种情况。但它也会发生在其他对象上,例如 { something: 1 }
    • 是的,对象是通过引用传递的......现在有意义了
    猜你喜欢
    • 2018-02-23
    • 2012-05-30
    • 1970-01-01
    • 2012-06-12
    • 2014-10-07
    • 2019-08-29
    • 2012-03-07
    • 2014-06-07
    • 2017-05-20
    相关资源
    最近更新 更多