Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.07.2012, 15:48
Аспирант
Отправить личное сообщение для almac Посмотреть профиль Найти все сообщения от almac
 
Регистрация: 29.06.2012
Сообщений: 31

Интересный вопросик, опять же связано с "основами" языка
Кто-нибудь может объяснить такую хитрую штуку.. Есть код:
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

Последний раз редактировалось almac, 11.07.2012 в 16:06.
Ответить с цитированием
  #2 (permalink)  
Старый 11.07.2012, 16:13
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

вопрос про наследование
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 11.07.2012, 16:56
Аспирант
Отправить личное сообщение для almac Посмотреть профиль Найти все сообщения от almac
 
Регистрация: 29.06.2012
Сообщений: 31

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

Я совсем уже ничего не понимаю. Выкладываю весь код (с дополнением):
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 - почему?

Последний раз редактировалось almac, 11.07.2012 в 17:09.
Ответить с цитированием
  #4 (permalink)  
Старый 11.07.2012, 17:24
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от 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
Прочитал ссылку выше, но мало что понял, так как есть противоречия..
Нет противоречия-есть непонимание основ и даже не основ ооп

Последний раз редактировалось dmitriymar, 11.07.2012 в 17:32.
Ответить с цитированием
  #5 (permalink)  
Старый 11.07.2012, 17:42
Аспирант
Отправить личное сообщение для almac Посмотреть профиль Найти все сообщения от almac
 
Регистрация: 29.06.2012
Сообщений: 31

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

Спасибо!
Ответить с цитированием
  #6 (permalink)  
Старый 11.07.2012, 17:44
Аспирант
Отправить личное сообщение для almac Посмотреть профиль Найти все сообщения от almac
 
Регистрация: 29.06.2012
Сообщений: 31

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск