2013-09-29 74 views
0

不確定有關術語。JavaScript中的透明分層數據框

我有一個JavaScript的「對象」有一些數據:

var parent = { foo: 42, bar: 2.71, baz: 3.14 }; 

我需要創建另一個JavaScript對象,將提供訪問父對象,同時支持本地覆蓋了父母的條目:

var child = extend(parent, { foo: 1, quo: 2 }); 

child.bar = 3; 
parent.qux = 4; 

assert(parent.foo === 42); 
assert(child.foo === 1); 

assert(parent.bar === 2.71); 
assert(child.bar === 3); 

assert(parent.baz === 3.14); 
assert(child.baz === 3.14); 

assert(parent.quo === undefined); 
assert(child.quo === 2); 

assert(parent.qux === 4); 
assert(child.qux === 4); 

// NB: I don't care about iteration on these objects. 

我需要儘可能低的開銷,同時跨瀏覽器足夠的解決方案。將父值複製到子項的開銷太大。

也就是說,我正在尋找類似於Lua metatable鏈的東西,但是在JavaScript中。

我正在閱讀關於[[Prototype]]鏈。它看起來像要走的路,但我還沒有弄清楚在這裏使用它們的輕量級方法。 (__proto__,據我所知,瀏覽器不夠用)

+0

聽起來像是你正在尋找'Object.create' :https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create。 –

+0

很酷,謝謝!小心添加它作爲被接受的答案? :) –

回答

0

通過降低初始化到子對象,我能想出這個(更新,感謝@FelixKling):

var wrap = function(parent) 
{ 
    var child = function() { }; 
    child.prototype = parent; 
    return new child(); 
} 

是否可以進一步改進?

這裏是一個的jsfiddle:http://jsfiddle.net/b5Q4n/2/

注意,根據意見提出,有一個JS的功能,這樣做需要什麼差不多:Object.createhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

+1

*「可以改進嗎?」*您可以刪除所有的構造函數。我沒有看到它的目的。 –