简体   繁体   中英

Is there an equivalent of PHP's 'parent' with javascript prototypal inheritance?

I'm using protypal inheritance and I would like to call an overridden method on the base class. In PHP I could do this using parent::functionName. Is this possible using JavaScript protypal inheritance?

Consider the following example:

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();

The output that I'm looking for in the console is:
doSomething in B
doSomething in A

With the code defined as I have it in the following fiddle: http://jsfiddle.net/JAAulde/psdym/2/

The best way is to .call() or .apply() A's method inside of B's:

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

Or, to simply pass all params that came into B.doSomething() in one fell swoop

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

An amazing book (written by a friend of mine) for learning about various patterns for inheritance in JS is http://www.amazon.com/JavaScript-Design-Patterns-Recipes-Problem-Solution/dp/159059908X

from my own best practices, best to create

var parent = ...;

when creating the object if reference to the parent is actually needed - which is not as much as one would expect. then use as desired.

I personally think the term "objects" is misleading in reference to javascript since

object == function == closure

essentially giving the tools for an objectness without limiting to formal object / inheritance constraints. on the up side it makes a very fluid, mutable language; on the downside, you need to fill in yourself missing pieces when needed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM