JavaScript Extending Class

前端 未结 10 1409

I have a base class:

function Monster() {
  this.health = 100;
}

Monster.prototype.growl = function() {
  console.log(\"Grr!\");
}

That

10条回答
  •  旧时难觅i
    2020-11-30 18:46

    Summary:

    There are multiple ways which can solve the problem of extending a constructor function with a prototype in Javascript. Which of these methods is the 'best' solution is opinion based. However, here are two frequently used methods in order to extend a constructor's function prototype.

    ES 2015 Classes:

    class Monster {
      constructor(health) {
        this.health = health
      }
      
      growl () {
      console.log("Grr!");
      }
      
    }
    
    
    class Monkey extends Monster {
      constructor (health) {
        super(health) // call super to execute the constructor function of Monster 
        this.bananaCount = 5;
      }
    }
    
    const monkey = new Monkey(50);
    
    console.log(typeof Monster);
    console.log(monkey);

    The above approach of using ES 2015 classes is nothing more than syntactic sugar over the prototypal inheritance pattern in javascript. Here the first log where we evaluate typeof Monster we can observe that this is function. This is because classes are just constructor functions under the hood. Nonetheless you may like this way of implementing prototypal inheritance and definitively should learn it. It is used in major frameworks such as ReactJS and Angular2+.

    Factory function using Object.create():

    function makeMonkey (bananaCount) {
      
      // here we define the prototype
      const Monster = {
      health: 100,
      growl: function() {
      console.log("Grr!");}
      }
      
      const monkey = Object.create(Monster);
      monkey.bananaCount = bananaCount;
    
      return monkey;
    }
    
    
    const chimp = makeMonkey(30);
    
    chimp.growl();
    console.log(chimp.bananaCount);

    This method uses the Object.create() method which takes an object which will be the prototype of the newly created object it returns. Therefore we first create the prototype object in this function and then call Object.create() which returns an empty object with the __proto__ property set to the Monster object. After this we can initialize all the properties of the object, in this example we assign the bananacount to the newly created object.

提交回复
热议问题