【发布时间】:2010-03-13 00:14:14
【问题描述】:
我使用了 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;
};
我将它用于我的每个原型对象,但因为我经常使用它,所以我希望将它磨练到最好的状态......我会喜欢想法和建议......
【问题讨论】:
标签: javascript prototyping rapid-prototyping