Это вопрос, который очень обсуждался, но я думаю, что причиной является отсутствие хорошей документации и хороших книг по этому вопросу.Объекты, прототипы и коснструкторы в javaScript
Когда я изучаю язык, я много разбираюсь, даже если некоторые из моих тестов абсурдны, но я думаю, что единственный способ понять вещи - это делать всевозможные эксперименты.
Я начинаю с JavaScript и, насколько я помню, больше, чем я смущен.
Давайте посмотрим код (не забывайте о не-чувства сейчас и рассмотрим только выходы):
function Vehicle()
{
this.color = 'Blue'
}
var car = new Vehicle()
console.log('Vehicle.constructor: ', Vehicle.constructor)
console.log('car.constructor: ', car.constructor)
console.log('Vehicle.prototype: ', Vehicle.prototype)
console.log('car.prototype: ', car.prototype)
console.log('Vehicle.constructor.prototype: ', Vehicle.constructor.prototype)
console.log('car.constructor.prototype: ', car.constructor.prototype)
console.log('Vehicle.prototype.constructor: ', Vehicle.prototype.constructor)
console.log('car.prototype.constructor: ', car.prototype.constructor)
Output:
Vehicle.constructor: Function()
car.constructor: Vehicle()
Vehicle.prototype: Vehicle {} // curly braces here
car.prototype: undefined
Vehicle.constructor.prototype: function()
car.constructor.prototype: Vehicle {} // curly braces here
Vehicle.prototype.constructor: Vehicle()
TypeError: car.prototype is undefined
Мои выводы:
Vehicle.prototype == car.constructor.prototype == Vehicle {} // фигурные скобки здесь
Vehicle.prototype.constructor == car.constructor == Vehicle() // скобки здесь
Vehicle.constructor == Функция() // прописные 'F'
Vehicle.constructor.prototype ==() функция // строчная 'е'
car.prototype == неопределенными // не определено, но не сообщается, как ошибка
car.prototype.constructor // Тип ошибки. Вот car.prototype 'сообщается как ошибка
Теперь давайте рассмотрим подобный код:
var car = {color: 'Blue'}
console.log('car.constructor: ', car.constructor)
console.log('car.prototype: ', car.prototype)
console.log('car.constructor.prototype: ', car.constructor.prototype)
console.log('car.prototype.constructor: ', car.prototype.constructor)
Output:
car.constructor: Object()
car.prototype: undefined
car.constructor.prototype: Object {} // curly braces here
TypeError: car.prototype is undefined
Как мы видим, здесь «car.prototype» является только не определено, но «автомобиль .prototype.constructor 'не определено и также' TypeError '
Данный код был протестирован в Firebug. Я не знаю, что это ошибка Firebug или ошибка JavaScript.
Все это меня озадачило.
Если это ООП в JavaScript Я думаю, что это больше ODP - Object (Dis) ориентированное программирование
EDIT
1) Почему car.prototype не определено, когда car.prototype. конструктор TypeError
2) Почему обе функции и объекты имеют конструкторы и прототипы (см. код выше)?
3) Что это значит:
Vehicle.constructor.prototype: функция()
Vehicle.prototype.constructor: Vehicle()
car.constructor.Прототип: Автомобиль {}
Мне сложно понять ваш вопрос. Что именно вы спрашиваете? Мы можем ответить на такие вопросы, как «какая разница между прототипом и конструктором» или «почему x.y дает неопределенное значение, когда x.y.z предоставляет TypeError», но вы не задаете ничего конкретного. Кажется, для вас лучше всего найти хорошую статью о функциях JavaScript, прототипах и конструкторах и понять отношения между ними. Вы можете попробовать [это] (http://www.codeproject.com/Articles/687093/Understanding-JavaScript-Object-Creation-Patterns), хотя есть и другие. – Avish
В принципе, я не понимаю, как отличаются прототипы и конструкторы, и почему мы можем иметь как связанные с объектами и функциями, так и смысл object.prototype.constructor (или обратного) – user3244003