【问题标题】:Any Other Ideas for prototyping原型设计的任何其他想法
【发布时间】:2010-03-13 00:14:14
【问题描述】:

我使用了 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;
};

我将它用于我的每个原型对象,但因为我经常使用它,所以我希望将它磨练到最好的状态......我会喜欢想法和建议......

【问题讨论】:

    标签: javascript prototyping rapid-prototyping


    【解决方案1】:

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

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

    这个例子展示了如何通过在对象前面加上下划线来添加被覆盖的对象。将您选择的命名空间放在适当的位置! (例如,您可以在对象上使用“超级”属性)

    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;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 2013-08-15
      • 1970-01-01
      相关资源
      最近更新 更多