分配给在ES5中作为参数传递的对象

时间:2017-01-19 16:32:10

标签: javascript ecmascript-5

我有一个对象,我将其作为参数传递给函数。在该函数内部我想为它赋予一个不同的值,但因为在函数内部我们只引用了原始对象,所以我们不能使用简单赋值=。

在ES2015中,我可以使用Object.assign

我是否可以在ES5中使用解决方法,而不是将属性复制到引用?

以下是https://jsbin.com/wimuvaqosi/1/edit?js,console

的示例
var x = {prop:1};

function foo(x1) {
  var y = {prop:2};
  x1 = y; //this obviously does not work
  //x1 = Object.assign(x1, y); //this works only in ES2015
}

foo(x);

console.log("x ", x);

2 个答案:

答案 0 :(得分:8)

  

我是否可以在ES5中使用解决方法,而不是将属性复制到引用?

不是,Object.assign也只是复制属性。但您只需使用polyfill并在es2015之前的代码中使用Object.assign():

if (typeof Object.assign != 'function') {
  Object.assign = function(target) {
    'use strict';
    if (target == null) {
      throw new TypeError('Cannot convert undefined or null to object');
    }

    target = Object(target);
    for (var index = 1; index < arguments.length; index++) {
      var source = arguments[index];
      if (source != null) {
        for (var key in source) {
          if (Object.prototype.hasOwnProperty.call(source, key)) {
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };
}

答案 1 :(得分:1)

您似乎正在尝试将x完全更改为其他对象。如果是这样,谢天谢地,你不能这样做。即使Object.assign(x, y)只是将x的属性复制到y,就像@ baao的垃圾邮件一样。 x仍然引用同一个对象。但你可以:

var x = {prop:1};
function foo(x1) {
    var y = {prop:2};
    return y;
}
x = foo(x);
console.log("x ", x);

或者

var x = {prop:1};
function foo(ref) {
    var y = {prop:2};
    ref.x = y;
}
var refX = {x: x};
foo(refX);
console.log("x ", refX.x);

IMO这些解决方案比你正在寻找的更好,因为调用者可以看到变量x现在指向另一个对象 - 这可能很重要。例如,在Javascript语言中,调用者可能总是做出如下假设:

 y = x;
 foo(x);
 y === x; // always true

我可以从查找表和其他结构中引用x,这些不会被替换 - 它可能会变得非常混乱。在其他语言中,例如C#,您可以通过引用传递对象,但是有一个不同的调用签名,如foo(ref x);,因此您可以轻松地看到在读取代码时可以替换x。