首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有其他关于原型的想法?

有没有其他关于原型的想法?
EN

Stack Overflow用户
提问于 2010-03-13 08:14:15
回答 1查看 174关注 0票数 2

我使用了Douglass的Object.beget,但稍微扩充了一下:

代码语言:javascript
复制
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;
};

这样你就可以一下子“生”和增强了。

代码语言:javascript
复制
var fop = Object.spawn(bar, {
  a: 'fast',
  b: 'prototyping'
});

在英语中,这意味着“创建一个名为'fop‘的新对象,使用'bar’作为原型,但更改或添加成员'a‘和'b’。如果你愿意,你甚至可以将它嵌套在规范中以原型更深层次的元素。”

代码语言:javascript
复制
var fop = Object.spawn(bar, {
  a: 'fast',
  b: Object.spawn(quux,{
    farple: 'deep'
  }),
  c: 'prototyping'
});

这有助于避免在长对象名中无意地进入对象的原型,例如:

代码语言:javascript
复制
  foo.bar.quux.peanut = 'farple';

如果quux是原型的一部分,而不是foo自己的对象,那么对'peanut‘的更改实际上会更改原型,影响所有由foo的原型对象原型化的对象。

但我离题了..。我的问题是。因为您的规范本身可以是另一个对象,并且该对象本身可以在您的新对象中具有其原型的属性-并且您可能需要这些属性...(至少在您决定将其用作规范之前,您应该意识到这些属性)……

我希望能够从规范的所有原型链中获取所有元素,但原型对象本身除外……这会将它们展平到新对象中。

目前我正在使用..。

代码语言:javascript
复制
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;
};

我将它用于我原型的每个对象,但因为我使用它太多,所以我希望将它磨练成最好的……我希望能有想法和建议。

EN

回答 1

Stack Overflow用户

发布于 2010-03-16 01:59:55

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

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

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

代码语言:javascript
复制
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;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2436689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档