2016-08-31 2 views
0

Недавно я обнаружил прототипы для себя, и был бы рад получить некоторую помощь с выяснить, в чем дело:JavaScript: InstanceOf оператора неожиданный результат

Пример кода 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, потому что я хочу сохранить методы для объекта Car внутри самого объекта. Я не уверен, что это можно сделать, но он работает до сих пор, кроме оператора «instanceof».

В первом примере он будет записывать «истина», но во втором он будет записывать «ложь», и я не знаю, где я ошибаюсь, поэтому, рассчитывая на вашу помощь, спасибо.

+1

'Car.makeCar' - объект _function_, а не _Car_. – vlaz

+0

'instanceof' проверяет, содержит ли цепочка прототипов объекта прототип конструктора. Цепочка прототипа bmw' содержит 'Car', а не' Car.makeCar'. – Barmar

+0

'bmw instanceof Car' все еще работает, потому что вы все еще создаете экземпляр для наследования из' Car.prototype' – 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

Whoa, insta-accept ровно через 7 секунд! Трудно победить :-) – Bergi

Смежные вопросы