17778


メソッド１：コンストラクタパターン

[code]

    function Dog(name, breed){
      Animal.call(this, "dog");
      this.name = name;
      this.breed = breed;
    }
    
[/code]

で、

[code]

    Animal.call(this, "dog");
    
[/code]

は何をしているのでしょうか？

・なくても意味は通るようにも思うのですが…

<http://postd.cc/javascript-inheritance-patterns/>


CC BY-SA 3.0
2015-10-18T11:44:33.013
17773
2015-10-18T12:44:03.453
7886
question
javascript
Animal.call(this, "dog"); は何をしているのでしょうか？ なぜ必要？


他のオブジェクト指向言語でいう、親クラスのコンストラクタやイニシャライザの呼び出しに相当するかと思います。

元のサンプルコードでいうと、this.typeの値に違いが出ます。

[code]

    var sparkie = new Dog("Sparkie", "Border Collie");
    console.log(sparkie.type);
    
[/code]


CC BY-SA 3.0
2015-10-18T12:43:12.053
17777
2015-10-18T12:43:12.053
4010
17773
answer


「意味が通る」かどうかは知りませんが、クラスベースの言語でいうところの「基底クラスのコンストラクタ」を呼び出す処理です。それがないと、基底クラス、ここでは
Animal のコンストラクタが実行されないため、その中で行われている `this.type` の設定が行われません。

[code]

    // http://postd.cc/javascript-inheritance-patterns/
    
    function Animal(type){
      this.type = type;
    }
    Animal.isAnimal = function(obj, type){
      if(!Animal.prototype.isPrototypeOf(obj)){
        return false;
      }
      return type ? obj.type === type : true;
    };
    function Dog(name, breed){
      // ↓これは不要？
      // Animal.call(this, "dog");
      
      this.name = name;
      this.breed = breed;
    }
    Object.setPrototypeOf(Dog.prototype, Animal.prototype);
    Dog.prototype.bark = function(){
      console.log("ruff, ruff");
    };
    Dog.prototype.print = function(){
      console.log("The dog " + this.name + " is a " + this.breed);
    };
    Dog.isDog = function(obj){
      return Animal.isAnimal(obj, "dog");
    };
    
    var sparkie = new Dog("Sparkie", "Border Collie");
    // 本来はtrueになるはずだが・・・
    document.write('Dog.isDog(sparkie): ' + Dog.isDog(sparkie));
[/code]

クラスベースの言語では `super(hoge)` という感じにそのまま呼び出せたりもしますが、Javascript にそのような機能はないため、
`Function.prorotype.call()` を使うことで、 `new Animal("dog")` としたとき同様 `this`
が対象オブジェクトを指すようにしています。


CC BY-SA 3.0
2015-10-18T12:44:03.453
17778
2015-10-18T12:44:03.453
8000
17773
answer