2011-12-21 73 views
1

我有对象字面什么,我认为是基本对象:的JavaScript - 添加属性对象常量和返回

var obj = { 
    key1 : 'value1', 
    key2 : 'value2' 
} 

,并想使用这个对象,并通过它与extention的功能就像

myFunction(obj + { key3 : 'value3' }); 

// param became: 
{ 
    key1 : 'value1', 
    key2 : 'value2', 
    key3 : 'value3' 
} 

myFunction(obj + { key2 : 'new value2' }); 

// param became: 
{ 
    key1 : 'value1', 
    key2 : 'new value2' 
} 

+运营商是不是它是正确的。我如何做到这一点?这是一种方式吗?

编辑:你想永久改变obj? - 不,我希望能够重新使用它作为基地的下一个呼叫。

回答

5

如果您能够接受改变obj,只是改变它,你通过它之前:

var obj = { /* stuff */ }; 

obj.key3 = 'value3'; 
myFunction(obj); 

你想永久改变OBJ? - 不,我希望能够重新使用它作为基地的下一个呼叫。

好了,所以你需要make a copy of obj,并改变副本 - 要么你打电话之前myFunction

var obj = { /* stuff */ }; 
var extension = {key3: 'value3'}; 

myFunction($.extend({}, obj, extension)); 

或通过obj和 “延伸” 到myFunction

var obj = { /* stuff */ }; 
var extension = {key3: 'value3'}; 

myFunction(obj, extension); 

并有myFunction做的工作:

function myFunction(base, ext) 
{ 
    if (typeof base === 'object' && typeof ext === 'object') 
    { 
     base = $.extend({}, base, ext); 
    } 

    // rest of the function logic here 
} 

如果你已经(或不介意)使用jQuery,$.extend()将是你最好的任务。

+0

你想永久改变obj吗? - 不,我希望能够重新使用它作为基地的下一个呼叫。 – bensiu 2011-12-21 22:42:24

0

您可以创建一个无损扩展对象(不是“延长”,真的,只要从另外一个新的对象)的功能,例如:

var oldObj = {name: 'foo'}; 

function extendNonDestructive(src, newProps) { 
    function F() {} F.prototype = src; 
    var newObj = new F; 
    for (var p in newProps) { 
    if (newProps.hasOwnProperty(p)) { 
     newObj[p] = newProps[p] 
    } 
    } 
    return newObj 
} 

var newObj = extendNonDestructive(oldObj, {lastName: 'bar'}); // Doesn't touch oldObj 

注意:您可能会感兴趣的Object.create其中比小的“函数F(){}; F.prototype = src;”在我的代码中,但它是ES5 +。

+0

这几乎就是'$ .extend'所做的 - 只是没有jQuery';-)' – 2011-12-22 03:50:44

+0

并且不改变原文。我不知道他使用的是jQuery – Alexander 2011-12-22 04:47:04

+0

关于jQuery的完全有效的观点,尽管'.extend()'不需要改变原来的东西,只是通过'{}'作为第一个参数。在意识到这是必要的之后,我编辑了我的答案。 – 2011-12-22 04:51:41