我使用了Douglass的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;
};我将它用于我原型的每个对象,但因为我使用它太多,所以我希望将它磨练成最好的……我希望能有想法和建议。
发布于 2010-03-16 01:59:55
如果我正确理解了您的问题,您是在问如何使用像您提供的方法,但仍然能够访问原型属性时,它们被规范覆盖?
解决无法访问(被覆盖)的原型属性问题的一种方法是将它们与规范一起添加到对象中,但将它们命名为空间。
这个例子展示了如何通过在对象前面加上下划线来添加被重写的对象。将您选择的名称空间放在合适的位置!(例如,您可以在对象上使用“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;
};https://stackoverflow.com/questions/2436689
复制相似问题