在javascript中将对象引用作为函数参数传递

时间:2017-01-09 09:01:13

标签: javascript oop prototype

这里我有一个简单的代码来了解Object.create()的工作原理。在这里,我有一个共同的对象用作prototypeObj的原型。newObj是一个将其原型设置为prototypeObj的对象。这里我有另一个名为session的对象,它有一个名为anotherObj的属性,anotherObjnewObj具有相同的原型。但是将新值添加到名为foo的属性(位于anotherObj的原型中),也会影响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);




1 个答案:

答案 0 :(得分:1)

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

anotherObj: create(newObj.foo)

您正在复制此处的引用,因此您的旧对象和新对象都将具有相同的数组引用以插入元素。如果您想要使用不同的数组引用,则应首先将其复制为create(newObj.foo.slice())

https://jsfiddle.net/x8ftnh82/