Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Интересный вопросик, опять же связано с "основами" языка (https://javascript.ru/forum/misc/29794-interesnyjj-voprosik-opyat-zhe-svyazano-s-osnovami-yazyka.html)

almac 11.07.2012 15:48

Интересный вопросик, опять же связано с "основами" языка
 
Кто-нибудь может объяснить такую хитрую штуку.. Есть код:
function Car(speed) {
  Car.prototype = {
    getSpeed: function() {
      return speed;
    }
  }
  Car.prototype.constructor = Car;
}
var car = new Car(100);

Почему car не видит метода getSpeed?
car.getSpeed(); //ошибка
car.constructor.prototype.getSpeed(); //вернет speed=100


В то же время можно делать так (не переопределяя прототип):

function Car(speed) {
  Car.prototype.getSpeed = function() {
    return speed;
  }
}
var car = new Car(100);
car.getSpeed(); //100

nerv_ 11.07.2012 16:13

http://javascript.ru/forum/misc/2943...tml#post184710

almac 11.07.2012 16:56

Прочитал ссылку выше, но мало что понял, так как есть противоречия..

Я совсем уже ничего не понимаю. Выкладываю весь код (с дополнением):
function Car(speed) {
  Car.prototype = {
    getSpeed: function() {
      return speed;
    }
  }
  Car.prototype.constructor = Car;
}
var car = new Car(100);
var car2 = new Car(200);
car.__proto__ // нет метода getSpeed - почему?
car2.__proto__ // есть метод getSpeed - почему?
car.__proto__ === Car.prototype; // false - почему?
car2.__proto__ === Car.prototype; //false - почему?

dmitriymar 11.07.2012 17:24

Цитата:

Сообщение от almac
car.__proto__ // нет метода getSpeed - почему?
car2.__proto__ // есть метод getSpeed - почему?
car.__proto__ === Car.prototype; // false - почему?
car2.__proto__ === Car.prototype; //false - почему?

а подумать ,что конструктор запускается 2 раза ? при первом -получает прототип ,какого не было при первом коструировании, и работает уже с "другим" конструктором при втором запуске.
Цитата:

Сообщение от almac
var car = new Car(100);
var car2 = new Car(200);

строки местами поменяй и результат будет диаметральный
Цитата:

Сообщение от almac
Прочитал ссылку выше, но мало что понял, так как есть противоречия..

Нет противоречия-есть непонимание основ и даже не основ ооп

almac 11.07.2012 17:42

Получается, что когда я вызываю var car = new Car() впервые, то:
1. Создается объект car (вернее this)
2. car.__proto__ (this.__proto__) присваивается текущий прототип, то есть car.__proto__ = Car.prototype, без метода getSpeed
2. А вот далее уже выполняется конструктор, в котором Car.prototype изменяется

Спасибо!

almac 11.07.2012 17:44

P.S. не надо так делать - прототип в конструкторе присваивать - только сейчас дошло ) Его достаточно 1 раз вне конструктора инициализировать


Часовой пояс GMT +3, время: 02:16.