2

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

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

4

1 回答 1

0

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

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

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

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;
};
于 2010-03-15T17:59:55.333 回答