2017-01-19 70 views
2

我有一個對象作爲參數傳遞給函數。在函數內部,我想給它賦予一個不同的值,但是因爲在函數內部我們只能引用原始對象,所以我們不能用=來簡單賦值。分配給在ES5中作爲參數傳遞的對象

在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); 
+0

在你的例子中:x1.prop = 2;你可以修改每個對象與另一個對象相等。不需要重新創建一個 –

+2

'Object.assign'不會將'x'分配給不同的對象。它將'y'的所有屬性複製到'x'。 @ baao的回答完全模仿'Object.assign'。 – James

回答

7

有一種解決方法,我可以在ES5使用,不是複製屬性參考其他?

不是,Object.assign也只是複製屬性。但是,你可以簡單地使用polyfill和使用Object.assign()在你的前ES2015代碼:

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

這不僅僅是polyfill複製屬性,這正是Object.assign所做的。 – Bergi

+1

相應地編輯了答案,絕對正確.. @Bergi – baao

1

它看起來像你正試圖改變x一個不同的對象完全。如果是這樣,你不能,謝天謝地,這樣做。即使Object.assign(x, y)只是將@​​ x的屬性複製到y,就像@ baao的polfill一樣。 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在讀取代碼時可能會被替換。

+0

對不起,您提出的是解決方法,而不是解決方案 – Sebas

+0

沒有解決方案,因此解決方法是有用的答案。 – James

+0

爲什麼慶幸?我發現通過引用而不是傳遞對象本身非常混亂 –

相關問題