我最近从C#er转换为Javascripter。我有一个基本的问题,我应该如何设计我的"类"就共同的属性/方法而言。
下面,我想要" id"作为一个共同的属性以及启动和停止方法。一定。 " id" MyDerivedClass的实例会有所不同。可能有MyOtherDerivedClass需要从MyBaseClass继承,所以想要这个" id"成为基地的共同财产。可能是我的想法是我需要做的正确,请让我知道如何重新设计它的方式通常在Javascript中完成。
var MyBaseClass = function(id){
MyBaseClass.prototype.id = id;
MyBaseClass.prototype.start = function(){
console.log('Starting item %s', this.id);
//...//
console.log('Started item %s', this.id);
};
MyBaseClass.prototype.stop = function(){
console.log('Stopping item %s', this.id);
//...//
console.log('Stopped item %s', this.id);
};
};
var MyDerivedClass = function(id){
MyDerivedClass.prototype.connected = false;
MyDerivedClass.prototype.id = id; //?????
};
inherit(MyDerivedClass, jsDialTone.common.items.DynamicItem);
// This is the inherit method
var inherit = function(child, base){
var Dummy = function(){};
Dummy.prototype = base.prototype;
child.prototype = new Dummy();
child.prototype.constructor = child;
};
var d1 = new MyDerivedClass('D1');
expect(d1.id).toBe('D1'); // passes
var d2 = new MyDerivedClass('D2');
expect(d1.id).toBe('D1'); // fails, since I modified the prototype.
答案 0 :(得分:2)
在构造函数中使用d2.id = 'D2'
(但真的是this.id = id
);并对connected
标志执行相同的操作。
实例之间的id值不,因此不适合在[[Prototype]]上使用共享属性。
通常,[[Prototype]]对象应该不在它们各自的构造函数中被修改,因为它通常没有意义:它类似于设置静态(或"在C#或Java构造函数中共享")变量。
答案 1 :(得分:1)
上述答案可以解决您的问题,这里还有一些。
function MyBaseClass(id) {
this.id = id;
}
MyBaseClass.prototype.start = function() {
console.log('Starting item ', this.id);
//...//
console.log('Started item ', this.id);
};
MyBaseClass.prototype.stop = function() {
console.log('Stopping item ', this.id);
//...//
console.log('Stopped item ', this.id);
};
function MyDerivedClass(id) {
MyBaseClass.call(this, id);
}
MyDerivedClass.prototype = Object.create(MyBaseClass.prototype);
var base = new MyBaseClass(1);
var derived = new MyDerivedClass(2);
base.start();
derived.start();
这应该在控制台中打印出来:
Starting item 1
Started item 1
Starting item 2
Started item 2
this
。请查看这些链接以获取更多参考:
JavaScript很奇怪。