Любые другие идеи для прототипирования

Я использовал 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;
};
Другие вопросы по тегам