2015-06-30 5 views
-1

Вот пример из Javascript сексуальный сайт:JavaScript прототип и это наследство

function People() { 
​this.superstar = "Michael Jackson"; 
} 

People.prototype.athlete = "Tiger Woods"; 

​// Define "athlete" property on the People prototype so that "athlete" is 
// accessible by all objects that use the People() constructor. 

Мой вопрос: Что разница между наследуют свойство спортсмена из people.prototype.athlete, как он будет внутри людей конструктора this.athlete="Tiger Woods";.

В комментариях сказано, что athlete доступен всем объектам, использующим конструктор People().

Но когда я ставлю это свойство атлетом, как я сказал внутри конструктора людей, он также будет доступен всем объектам, использующим конструктор People().

В чем разница между 1 и 2?

//1 
function People() { 
​this.superstar = "Michael Jackson"; 
} 
People.prototype.athlete = "Tiger Woods"; 

//2 
function People() { 
​this.superstar = "Michael Jackson"; 
this.athlete = "Tiger Woods"; 
} 

Когда я создаю объект, используя пример # 1:

var person = new People(); 
console.log(person.hasOwnProperty('superstar')); //TRUE 
console.log(person.hasOwnProperty('athlete')); // FALSE 

Я знаю, что athlete имущество не принадлежит по person объекта.

Но каковы другие отличия?

+0

Это принципиально единственное отличие. (и, конечно же, 'Person.prototype.hasOwnProperty (...)') – Bergi

+0

Однако последствия этой разницы огромны ... Попробуйте создать несколько экземпляров, а затем смените 'Person.prototype.athlete', чтобы понять, что наследование свойств действительно * означает * ! – Bergi

+0

Возможный дубликат [Понимание прототипного наследования в JavaScript] (http://stackoverflow.com/questions/892595/understanding-prototypal-inheritance-in-javascript) – hazzik

ответ

0

Короткий ответ: обмен памяти.

Поскольку прототип имеет значение "Tiger Woods" только один раз, с другой стороны, каждый экземпляр People будет иметь свое значение для superstar. В этом случае я думаю, что память обычно оптимизируется со строками (исправьте меня, если я ошибаюсь), но если бы это был объект, это была бы другая история, новый объект будет определяться каждый раз, когда вы создаете People.

Кроме того, если вы измените People.prototype.athlete, каждое значение по умолчанию для любого экземпляра People (в любом месте) будет вновь определенное значение (если вы overrid его для одного или нескольких экземпляров через, instance.athlete, ну это не важно).

+0

Вы сказали, что я цитирую «Также, если вы изменяете People.prototype.athlete, каждое значение по умолчанию для любого экземпляра People (где угодно) было бы новым значением «это правда, но в 2-м примере, если я изменяю this.athlete (внутри конструктора), он также изменяет значение любых экземпляров конструктора People. – PiotrX

+0

Конструктор вызывается только один раз для каждого экземпляра. Это означает, что вы не можете обновить конструктор People (после instanciation) и надеяться, что он изменит ранее созданных людей, одна из сильных сторон прототипа заключается в том, что если вы его измените, поля прошлых экземпляров также будут изменены (если поля не были переопределены после инстанцирования по экземпляру напрямую). – axelduch

+0

Спасибо aduch, но не могли бы вы привести мой пример того, что вы сказали для лучшего понимания? – PiotrX

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