Я использовал 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;
};
Я использую его для каждого прототипа объекта, но, поскольку я так часто его использую, я стремлюсь отточить его как можно лучше ... Мне бы очень хотелось, чтобы мысли и предложения ...