我使用了 Douglass 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'
});
在英语中,这意味着“为我创建一个名为 'fop' 的新对象,以 'bar' 为原型,但更改或添加成员 'a' 和 'b'。您甚至可以将其嵌套在规范中以原型化更深层次的元素,应该你选。
var fop = Object.spawn(bar, {
a: 'fast',
b: Object.spawn(quux,{
farple: 'deep'
}),
c: 'prototyping'
});
这可以帮助避免在长对象名称中无意中跳入对象的原型,例如:
foo.bar.quux.peanut = 'farple';
如果 quux 是原型的一部分而不是 foo 自己的对象,那么您对 'peanut' 的更改实际上会更改原型,影响由 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;
};
我将它用于我原型的每个对象,但是因为我经常使用它,我希望将它磨练到最好的状态......我会喜欢想法和建议......