Javascript:正确的继承属性/方法的方法

时间:2015-07-17 06:08:27

标签: javascript inheritance prototype

我最近从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.

2 个答案:

答案 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

  • 您将创建MyBaseClass类,然后在其原型上设置方法。
  • 然后,您将创建一个使用.call()方法的MyDerivedClass,该方法将运行MyBaseClass函数,但它将使用第一个参数显式设置this
  • 然后,使用Object.create()将MyDerivedClass的原型设置为MyBaseClass的原型。

请查看这些链接以获取更多参考:

Prototypal inheritance

The .call() method

JavaScript很奇怪。