Javascript 还有其他关于原型设计的想法吗
我使用了Douglass Crockford的Object.beget,但对其进行了略微扩展,以:Javascript 还有其他关于原型设计的想法吗,javascript,prototyping,rapid-prototyping,Javascript,Prototyping,Rapid Prototyping,我使用了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] =
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自己的对象,那么对“花生”的更改实际上会更改原型,从而影响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;
};
我为我的每一个原型对象使用它,但因为我经常使用它,所以我希望尽可能地将其细化到最佳状态……我希望得到一些想法和建议……如果我正确理解了你的问题,你会问如何使用你提供的方法,但当原型属性为受规格限制 解决无法访问(重写)原型属性问题的一种方法是将它们与规范一起添加到对象中,但对它们进行名称空间命名 此示例演示如何通过在对象前加下划线将重写的添加到对象中。将所选名称空间放在其位置!(例如,可以在对象上使用“super”属性)
如果我正确理解了您的问题,您会问如何使用您提供的方法,但在规范覆盖原型属性时仍然能够访问原型属性 解决无法访问(重写)原型属性问题的一种方法是将它们与规范一起添加到对象中,但对它们进行名称空间命名 此示例演示如何通过在对象前加下划线将重写的添加到对象中。将所选名称空间放在其位置!(例如,可以在对象上使用“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;
};