调用Class.prototype = new MyClass()是否确保每次都重新实例化超类?

时间:2013-12-02 22:28:02

标签: javascript prototype javascript-objects

我正在使用:

var ReportsServiceCall = function () { };

ReportsServiceCall.prototype = new ServiceCall();

使用此代码,ServiceCall每次创建new ReportsServiceCall时都是新实例吗?我需要它。

5 个答案:

答案 0 :(得分:3)

<强>都能跟得上

正如您所写,原型只设置一次。但是,这不是一个很好的写作方式。

我会像这样写

var ReportsServiceCall = function () {

  // parent constructor; optional
  ServiceCall.call(this);
};

// setup prototype; see comment below
ReportsServiceCall.prototype = Object.create(ServiceCall.prototype, {
  constructor: {
    value: ReportsServiceCall,
    enumerable: false,
    writable: true,
    configurable: true
  }
});

注意:除了设置super_之外,这就是node.js在util.inherits函数中执行vanilla继承的方式。

一旦你理解它是如何工作的,这是非常有效的技术。

答案 1 :(得分:2)

  

使用此代码,ServiceCall每次都是一个新实例吗?

不,这不是设置继承的好方法。在您调用new ServiceCall时,您实际上并不想创建ServiceCall的实例(如果构造函数需要参数,您会传递哪些参数?)。您真正想要的就是将ServiceCall的原型添加到ReportsServiceCall的原型链中。

您应该使用Object.create并在子类构造函数中调用超类构造函数:

var ReportsServiceCall = function () {
    ServiceCall.call(this);
};

ReportsServiceCall.prototype = Object.create(ServiceCall.prototype);

有关此模式的扩展说明,请参阅Benefits of using `Object.create` for inheritance

答案 2 :(得分:1)

恕我直言,因为你只是设置原型

答案 3 :(得分:1)

原型只是一个由ReportsServiceCall的所有实例共享的对象。如果您需要为每个ServiceCall实例调用ReportsServiceCall构造函数,则可以执行以下操作:

function ReportsServiceCall() {
  ServiceCall.call(this);
};
ReportsServiceCall.prototype = new ServiceCall();
ReportsServiceCall.prototype.constructor = ReportsServiceCall;

答案 4 :(得分:1)

不是。

ReportsServiceCall ServiceCall,但使用ReportsServiceCall创建new并不会使其拥有自己的属性ServiceCall的构造函数。

请看以下示例:

var ServiceCall=function () {
    this.Id=Math.random();
};

var ReportsServiceCall=function () {
};

ReportsServiceCall.prototype=new ServiceCall();

var x=new ReportsServiceCall();
var y=new ReportsServiceCall();

alert(x.Id===y.Id); // true .. so, what Id for?

其中一个解决方案是:

var ReportsServiceCall=function () {
    ServiceCall.apply(this, arguments);
};