2010-03-13 62 views
2

我用道格拉斯Crockford的Object.beget,但增強它稍微:任何其他想法的原型

Object.spawn = function (o, spec) { 
    var F = function() {}, that = {}, node = {}; 
    F.prototype = o; 
    that = new F(); 
    for (node in spec) { 
    if (spec.hasOwnProperty(node)) { 
     that[node] = spec[node]; 
    } 
    } 
    return that; 
}; 

這樣你就可以「生出」並一舉增加。甚至

var fop = Object.spawn(bar, { 
    a: 'fast', 
    b: 'prototyping' 
}); 

在英語中,這意味着,「讓我一個叫‘花花公子’與‘酒吧’爲原型的新對象,但更改或添加成員‘A’和‘B’。 可以嵌套它規範原型更深層次的元素,你應該選擇

var fop = Object.spawn(bar, { 
    a: 'fast', 
    b: Object.spawn(quux,{ 
    farple: 'deep' 
    }), 
    c: 'prototyping' 
}); 

這有助於避免在長對象名跳躍到一個對象的原型,無意像:

foo.bar.quux.peanut = 'farple'; 

如果QUUX爲p原型的藝術而不是foo自己的對象,那麼對「花生」的改變實際上會改變原型,影響foo原型對象原型化的所有對象。

但我離題...我的問題是這樣的。因爲你的規範本身可以是另一個對象,而且這個對象本身可以在它的新對象中有它的原型的屬性 - 並且你可能需要這些屬性......(至少在你決定將它用作規範之前你應該知道它們)...

我希望能夠從規範的所有原型鏈中獲取所有元素,除了原型對象本身...這會將它們壓扁成新的對象。

目前我使用...

Object.spawn = function (o, spec) { 
    var F = function() {}, that = {}, node = {}; 
    F.prototype = o; 
    that = new F(); 
    for (node in spec) { 
    that[node] = spec[node]; 
    } 
    return that; 
}; 

我用它爲每個對象我的原型,而是因爲我用它了這麼多,我在尋找磨練下來的最好的.. ..我會喜歡的想法和建議...

回答

0

如果我已經正確理解你的問題,你問如何使用像你提供的方法,但仍然能夠訪問原型屬性時被規範覆蓋了嗎?

解決無法訪問(重載)原型屬性問題的一種方法是將它們與規範一起添加到對象,但將它們命名空間。

這個例子展示瞭如何通過在下劃線前加上被覆蓋的對象。把你的命名空間的選擇放在它的地方! (例如,您可以在對象上使用「超級」屬性)

Object.spawn = function (o, spec) { 
    var F = function() {}, that = {}, node = {}; 
    F.prototype = o; 
    that = new F(); 
    for (node in spec) { 
    if("undefined" !== typeof o[node]) { 
     that['_' + node] = o[node]; 
    } 
    that[node] = spec[node]; 
    } 
    return that; 
};