Любые другие идеи для прототипирования
Я использовал 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;
};
Я использую его для каждого прототипа объекта, но так как я использую его так много, я хочу отточить его как можно лучше... Мне бы очень хотелось, чтобы мысли и предложения...
1 ответ
Если я правильно понял ваш вопрос, вы спрашиваете, как использовать подход, подобный тому, который вы предоставили, но все же сможете получить доступ к свойствам прототипа, если они переопределены спецификацией?
Одним из способов обойти проблему недоступных (переопределенных) свойств прототипа является добавление их к объекту вместе со спецификацией, но с пространством имен.
В этом примере показано, как можно добавить переопределенный объект, добавив к нему подчеркивание. Поместите свое пространство имен по своему выбору! (например, вы можете использовать свойство 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;
};