【问题标题】:Setting the prototype of a function without __proto__ in Javascript在Javascript中设置没有__proto__的函数原型
【发布时间】:2015-03-19 20:50:17
【问题描述】:

我想创建一个以对象为原型的构造函数。

例如:

var constructor=function(){
  this.foo=bar;
}

var constructorProto={
  method:function(){}
}

constructor.__proto__=constructorProto;

constructor.method();
new constructor;

功能演示:http://jsfiddle.net/juwt5o97/

这允许我在调用new 之前传递构造函数并对其进行修改。但是,我不想使用__proto__Object.setPrototypeOf()。有没有“正确”的方式来做到这一点?

【问题讨论】:

  • 为什么你认为Object.setPrototypeOf() 不“合适”?
  • prototypes 不是静态方法,所以它会混淆你想要什么......你可以直接说constructor.method=constructorProto.method;,或者使用 Extend 或 Object.create() 来复制。
  • 我记得在某处读过它不应该使用它,也许我把它与__proto__ 混淆了。无论如何,它是 ES6,如果有适用于 ES5 的方法,我更愿意。
  • “我记得在某处读到它不应该被使用……” 我想你可能没有抓住重点。他们可能不是说不应该使用这种改变原型的特殊方式。他们可能会说你根本不应该改变它。
  • @dandavis 构造函数可能会创建多次,所以我不想为每个构造函数重新创建方法。

标签: javascript oop prototype


【解决方案1】:

如果您想扩展您的第一个类的原型(以便实例继承方法),您可以使用Object.create

var ClassA=function(){
  this.foo='bar';
}

var protoObject = {
  method:function(){alert('t');}
}

ClassA.prototype = Object.create(protoObject);

new ClassA().method();

如果您只想将静态函数附加到第一个函数,那么您可以这样做:

for (var property in protoObject) {
  if (typeof protoObject[property] == 'function') {
    ClassA[property] = protoObject[property];
  }
}

ClassA.method();

【讨论】:

  • 允许他“在调用new之前修改它”。他只是不能在调用 new 之前调用它。那将……根本不涉及原型。它只是一个静态属性...
  • 但我认为他想在创建实例之前运行constructor.method()...这不是一个明确的问题。
  • 嗯,我会更新我的示例,但如果这是他想要的......他误解了原型的工作原理
  • 我很确定是这样,但我喜欢你处理这两种潜力的方式。
  • 谢谢。 :) 感谢您指出我可能误解了他在寻找什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
相关资源
最近更新 更多