我使用了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;
};
我将它用于我原型的每个物体,但因为我使用它太多了,我希望尽可能地将它磨练......我会喜欢它的想法和建议......
答案 0 :(得分:0)
如果我已正确理解您的问题,您会问如何使用您提供的方法,但仍然能够在规范覆盖原型属性时访问它们?
解决无法访问(重写)原型属性问题的一种方法是将它们与规范一起添加到对象中,但命名它们。
此示例显示如何通过在其前面添加下划线来将重写添加到对象。把你选择的命名空间放在它的位置! (例如,您可以在对象上使用'super'属性)
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;
};