Быстрое наследование JavaScript: понимание __proto__ - PullRequest
1 голос
/ 03 июня 2011

Учитывая следующий конструктор,

Dog = function(name, age, ...){
    Animal.call(this, name, age, ...);
    // And some other stuff that dogs do
}

Я использую следующую строку кода для копирования моих методов и свойств из класса Animal,

Dog.prototype = new Animal();

Не могли бы вы объяснить мне, чем это отличается от

Dog.prototype.__proto__ = Animal.prototype;

так как они, кажется, имеют одинаковый эффект.

Ответы [ 2 ]

5 голосов
/ 03 июня 2011

__proto__ позволяет получить доступ к внутреннему атрибуту [[Prototype]] объекта. Его можно использовать для получения или установки прототипа уже существующего объекта .

protoype - это свойство функции для установки прототипа объектов, которые будут созданы этой функцией.

Afaik, только Firefox позволяет использовать __proto__. Это не стандартно и не рекомендуется .


Стоит прочитать:

4 голосов
/ 03 июня 2011

__proto__ - это нестандартное расширение JavaScript (распространенное в разных интерпретаторах, но нестандартное), которое дает вам прямой доступ к прототипу позади объекта. Свойство prototype функциональных объектов - это объект, которому будет присвоено в качестве прототипа объекта, созданного путем вызова функции через new. Поэтому, когда вы присваиваете prototype.__proto__, вы присваиваете прототип за объектом, который будет установлен как прототип для новых объектов, созданных функцией.

Поскольку цепочка прототипов работает так, что свойства прототипа отображаются как унаследованные свойства объекта (и это продолжается в цепочке), если вы присваиваете Dog.prototype.__proto__, объекты, созданные Dog, будут иметь косвенный доступ к этим свойствам по цепочке:

+-----------------+      +----------------+      +-------------------------+
| instance of Dog |----->| Dog.prototype  |----->| Dog.prototype.__proto__ |
|                 |      |                |      | `foo` property          |
|                 |      |                |      | `bar` property          |
+-----------------+      +----------------+      +-------------------------+

При непосредственном присвоении Dog.prototype экземпляры имеют более прямую ссылку:

+-----------------+      +----------------+
| instance of Dog |----->| Dog.prototype  |
|                 |      | `foo` property |
|                 |      | `bar` property |
+-----------------+      +----------------+

(Обратите внимание, что вышеприведенное * слегка вводит в заблуждение, ссылаясь на Dog.prototype подобным образом. Экземпляры Dog получат прямую ссылку на объект в Dog.prototype с того момента, когда new Dog Если вы назначите совершенно другой объект для Dog.prototype позже, экземпляры, которые уже существуют, будут иметь старый прототип, а новые экземпляры получат новый. Но это побочный эффект.)

...