我正在使用:
var ReportsServiceCall = function () { };
ReportsServiceCall.prototype = new ServiceCall();
使用此代码,ServiceCall
每次创建new ReportsServiceCall
时都是新实例吗?我需要它。
答案 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);
};