Javascript 还有其他关于原型设计的想法吗

Javascript 还有其他关于原型设计的想法吗,javascript,prototyping,rapid-prototyping,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] =

我使用了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自己的对象,那么对“花生”的更改实际上会更改原型,从而影响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;
};

我为我的每一个原型对象使用它,但因为我经常使用它,所以我希望尽可能地将其细化到最佳状态……我希望得到一些想法和建议……

如果我正确理解了你的问题,你会问如何使用你提供的方法,但当原型属性为受规格限制

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

此示例演示如何通过在对象前加下划线将重写的添加到对象中。将所选名称空间放在其位置!(例如,可以在对象上使用“super”属性)


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

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

此示例演示如何通过在对象前加下划线将重写的添加到对象中。将所选名称空间放在其位置!(例如,可以在对象上使用“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;
};