Любые другие идеи для прототипирования - PullRequest
2 голосов
/ 13 марта 2010

Я использовал 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 Ответ

0 голосов
/ 15 марта 2010

Если я правильно понял ваш вопрос, вы спрашиваете, как использовать подход, подобный тому, который вы предоставили, но все же сможете получить доступ к свойствам прототипа, если они переопределены спецификацией?

Один из способов обойти проблему недоступных (переопределенных) свойств прототипа - добавить их к объекту вместе со спецификацией, но присвоить им пространство имен.

В этом примере показано, как можно добавить переопределенный объект, добавив к нему подчеркивание. Поместите свое пространство имен по своему выбору! (например, вы можете использовать свойство 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;
};
...