2014-01-28 4 views
0

Это вопрос, который очень обсуждался, но я думаю, что причиной является отсутствие хорошей документации и хороших книг по этому вопросу.Объекты, прототипы и коснструкторы в 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.Прототип: Автомобиль {}

+0

Мне сложно понять ваш вопрос. Что именно вы спрашиваете? Мы можем ответить на такие вопросы, как «какая разница между прототипом и конструктором» или «почему x.y дает неопределенное значение, когда x.y.z предоставляет TypeError», но вы не задаете ничего конкретного. Кажется, для вас лучше всего найти хорошую статью о функциях JavaScript, прототипах и конструкторах и понять отношения между ними. Вы можете попробовать [это] (http://www.codeproject.com/Articles/687093/Understanding-JavaScript-Object-Creation-Patterns), хотя есть и другие. – Avish

+0

В принципе, я не понимаю, как отличаются прототипы и конструкторы, и почему мы можем иметь как связанные с объектами и функциями, так и смысл object.prototype.constructor (или обратного) – user3244003

ответ

0

Каждый раз, когда вы объявляете объект с использованием объекта буквального обозначения

var newObject = {foo: 'bar'}; 

Вы создаете объект, который наследует от 'Object()' и не имеет прототипа его собственного.

Уведомление при звонке 'car.constructor' оно возвращает 'Object()'. Это потому, что это конструктор JS использует в объектной литературе.

Когда вы звоните по номеру 'car.prototype', это не определено, потому что объектные литералы не имеют собственного прототипа.

Когда вы вызываете 'car.constructor.prototype', он возвращает пустой объект, поскольку это по существу значение 'Object()'. Он просто создает объекты.

для того, чтобы ваши объекты имеют свои прототипы необходимо установить конструктор и использовать

'new myObject()' объявлять объекты.

Надеюсь, я помог ответить на ваш вопрос. Вот несколько ссылок, которые имеют больше информации:

Adding Prototype to JavaScript Object Literal

http://doctrina.org/Javascript-Objects-Prototypes.html

http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/

0

Вы должны помнить вечно: Каждая функция в JavaScript на самом деле является объектом функции, как функция, унаследованных от объекта, любая функция также является объектом. Таким образом, имея в виду это предложение, посмотрите на это:

(function f(){}) instanceof Function;  // true 
(function f(){}) instanceof Object;   // true, as Function is an instance of Object 
({}) instanceof Object;      // true 
({}) instanceof Function;     // false! 

Function.prototype instanceof Object;  // true 
Function instanceof Object;     // true, as all objects in JS are inherited  from Object 
Object instanceof Function;     // true, as Object is a constructor function, therefor: 
Function instanceof Function;    // true 
Object instanceof Object;     // true, but: 
Date instanceof Date;      // false 

Function.prototype.constructor === Function; // true 
Function.constructor === Function;   // true  

typeof Object === 'function';    // true, as Object is a constructor function 

Таким образом, различные фигурные скобки показывают, что прототип всегда является объектом (фигурные скобки), если она определена, и конструктор всегда является функцией. Это все.

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