原型制作的任何其他想法

时间:2010-03-13 00:14:15

标签: 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] = 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 :(得分:0)

如果我已正确理解您的问题,您会问如何使用您提供的方法,但仍然能够在规范覆盖原型属性时访问它们?

解决无法访问(重写)原型属性问题的一种方法是将它们与规范一起添加到对象中,但命名它们。

此示例显示如何通过在其前面添加下划线来将重写添加到对象。把你选择的命名空间放在它的位置! (例如,您可以在对象上使用'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;
};