2016-08-31 2 views
0

のinstanceof私は最近、自分のためにプロトタイプを発見した、との事を考え出すといくつかの助けを得るために幸せになる:はJavaScript:オペレータの予期しない結果

コード例1:

"use strict"; 

    var Car = function(loc) { 
     var obj = Object.create(Car.prototype); 
     obj.loc = loc; 
     return obj; 
    }; 

    Car.prototype.move = function() { 
      this.loc++; 
      return this.loc; 
    }; 

    var bmw = Car(6); 

    console.log(bmw instanceof Car); 

コード例2を:

"use strict"; 

    var Car = { 
     "makeCar": function(loc) { 
      var obj = Object.create(Car.prototype); 
      obj.loc = loc; 
      return obj; 
     }, 
     "prototype": { 
      "move": function() { 
       this.loc++; 
       return this.loc; 
      } 
     } 
    }; 

    var bmw = Car.makeCar(6); 

    console.log(bmw instanceof Car.makeCar); 

私は例2を書いたので、カーオブジェクトのメソッドをオブジェクト自体の中に残したいからです。私はそれが完了できるかどうかはわかりませんが、 "instanceof"演算子を除いてこれまでのところ動作しています。

最初の例では「true」と記録されますが、2番目に「false」と記録されます。どこが間違っているのかわからないので、お手数ですが、ありがとうございます。

+1

Car.makeCarは_Car_オブジェクトではありません。 – vlaz

+0

'instanceof'は、オブジェクトのプロトタイプチェーンにコンストラクタのプロトタイプが含まれているかどうかをテストします。 'bmw'のプロトタイプチェーンは' Car.makeCar'ではなく 'Car'を含んでいます。 – Barmar

+0

'Car.prototype'から継承するインスタンスをまだ作成しているので、' bmw instanceof Car'はまだ動作します – Bergi

答えて

1

console.log(bmw instanceof Car.makeCar); yields false

... Car.makeCarはその.prototype財産上のインスタンスのプロトタイプを持っていないため。 instanceofの式はCar.makeCar.prototype.isPrototypeOf(bmw)に相当します。それを機能させるには、

Car.makeCar.prototype = Car.prototype; 

と設定する必要がありますが、それは変です。ちょうど標準パターンを保つ。構造体の中でメソッドをコンストラクタとともに宣言する場合は、IEFE like hereにすべてをラップするか、ES6クラスを使用するだけです。

+0

ありがとうございました! :D学ぶために多くのもの... – Mike

+0

ああ、insta - 正確に7秒で受け入れる!それは勝つのが難しいです:-) – Bergi