2011-04-01 88 views
3

我正在使用protypal继承,我想在基类上调用重写的方法。在PHP中,我可以使用parent :: functionName来做到这一点。这可能使用JavaScript protypal继承?有没有相当于PHP的'父'与JavaScript原型继承?

考虑下面的例子:
doSomething的所述的

+0

退房http://stackoverflow.com/questions/183702/access-parents-parent-from-javascript-object - 看起来像有一个答案。 – 2011-04-01 01:59:20

+0

@Demian。谢谢,不知道这适用于protypal继承虽然。 – 2011-04-01 02:29:45

回答

2

随着代码定义为I有
doSomething的在B:

var A = function(){ 

    this.doSomething = function(){ 
     console.log('doSomething in A'); 
    }; 

}; 


var B = function() { 

    this.doSomething = function(){ 
     //I would like to call A.doSomething() 
     //I tried this.prototype.doSomething() and A.doSomething.call(this), but neither works 
     console.log('doSomething in B'); 
    }; 

}; 

B.prototype = new A(); 


var test = new B(); 
test.doSomething(); 

说我在控制台寻找的输出是它在下面的小提琴中:http://jsfiddle.net/JAAulde/psdym/2/

最好的方法是.call()或.apply()A的方法在B的内部:

//Inside of B.doSomething 
A.prototype.doSomething.call(this, arg1, arg2); 

或者,简单地传递,在一个走进B.doSomething()一举

//Inside of B.doSomething 
A.prototype.doSomething.apply(this, arguments); 

一个惊人的书(我的一个朋友写的)学习有关的各种图案继承所有PARAMS在JS是http://www.amazon.com/JavaScript-Design-Patterns-Recipes-Problem-Solution/dp/159059908X

+0

你的意思是'B.prototype'?在这个例子中'A.prototype'是空的。 – Reid 2011-04-01 01:54:35

+0

如果函数在构造函数中被声明,会在'A.prototype'上使用'doSomething'吗? – sdleihssirhc 2011-04-01 01:54:36

+0

啊,对不起,我们不能仔细关注确切的例子。我的回答并不完全正确,虽然它会与原始代码的不同设置... – JAAulde 2011-04-01 01:57:16

0
从我自己的最佳实践

,最好,如果参考,创建对象时创建

var parent = ...; 

实际上对父母而言是需要的 - 这不如人们所期望的那么高。然后根据需要使用。

我个人认为术语“对象”中提到的JavaScript是一种误导,因为

object == function == closure 

根本上给一个对象性的工具,但不限制于正规的对象/继承约束。另一方面,它使流畅,易变的语言;在缺点方面,你需要在需要的时候填写自己缺失的部分。

+0

我知道你在说什么,但我不认为这很“容易”,因为JS会让习惯于经典继承的人们感到困惑(比如PHP,虽然它的实现很片面) 。为了在JS中获得经典的继承,需要大量的鞋子,并且通常会揭示对语言和其功能范式的误解(< - 双语!)。 – JAAulde 2011-04-01 11:52:12