的Javascript实例子类与父属性

问题描述:

我新的Javascript功能来OOP和只需要得到与此交手。的Javascript实例子类与父属性

如果我有一个特性

function myClass(){ 
this.foo=null; 
} 

然后我用继承来创建一个子类

myChild.prototype = new myClass(); 

function myChild(){ 
alert(this.foo); 
} 

如何实例子类如我希望当我设置foo的属性的类提醒'酒吧'。我不想简单地传递“酒吧”到myChild因为我有相关的MyClass中的方法,而不是myChild属性来设置的列表。

var newChild = new myChild(); 
+0

你的第一个片段缺失'()',如果你想字符串'bar'那么你需要引用它。 – pimvdb 2012-03-05 14:25:24

+0

编辑,修复错误 – user1209203 2012-03-05 14:26:13

+0

我不知道,你想通过'“酒吧”'。哪个功能应该接受并设置它?该子类应设置它,但你不希望它传递到子类 - 你能否详细说明吗? – pimvdb 2012-03-05 14:28:06

实际上,你可以找到这个问题的答案也in my answer to previous question,它类似于其它语言的继承。

如果扩展一个类,子类的构造函数必须接受它自己的参数父类的参数。因此,假如您有:

function Parent(a) { 
    this.foo = a; 
}; 

// and 

function Child(b, a) { 
    Parent.call(this, a); // executes the parent constructor for this instance 
    this.bar = b; 
    alert(this.foo); 
}; 

inherits(Parent, Child); 

(的inherits实现可以在this answer找到)。

里面Child你必须调用父类的construtor和传递的参数,类似于你如何在Java或Python这样做。

如果你有很多的参数,那么你可以使用arguments对象,使事情变得更简单:

function Parent(a, b, c, d) {...}; 

function Child(e, f) { 
    // c and d are parameters for `Child` 
    // arguments[0] == e 
    // arguments[1] == f 
    // all other arguments are passed to Parent, the following 
    // creates a sub array arguments[2..n] 
    Parent.apply(this, [].slice.call(arguments, 2); 
    /... 
} 

// later 

var child = new Child(e, f, a, b, c, d); 

一般来说,myChild.prototype = new myClass();是不是一个很好的遗传模式,因为大多数的时间,班级期待一些论点。这不会为每个实例执行父构造函数,而只对所有实例执行一次。

+0

谢谢felix接受答案,因为它回答我的问题,但我意识到我可以做到这一点更简单的实例化对象的一些参数,然后调用带有额外参数的方法新线,而不是试图一口气做到这一切。 – user1209203 2012-03-05 17:32:13

你可以只设置属性在孩子的构造,像这样:

myChild.prototype = new myClass(); 

function myChild(){ 
    this.foo = "bar"; 
} 

这是你想要的吗?

或者,如果你想成为灵活什么foo包含在每一种情况下,你可以设置它的子类的实例化后右:

var child = new myChild(); 
child.foo = "bar"; 

参数化的施工方法。

function myClass(foo){ 
    this.foo=foo; 
} 
myChild.prototype = new myClass('bar'); 

function myChild(){ 
    alert(this.foo); 
} 
var newChild = new myChild(); 

或:

function myClass(){ 
     this.foo=null; 
    } 
    myChild.prototype = new myClass(); 
    myChild.prototype.foo = 'bar'; 
    function myChild(){ 
     alert(this.foo); 
    } 
    var newChild = new myChild(); 
+0

我不能做到这一点,因为每个对象都会得到不同的值 – user1209203 2012-03-05 14:38:53

+0

这是你想要的吗? 'myChild.prototype.foo ='bar';' – 2012-03-05 14:43:13