2010-03-13 68 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; 
};