__proto__ и наследование в Javascript - PullRequest
6 голосов
/ 13 августа 2010

Я изучал наследование javascript в течение пары дней, и хотя я добился значительного прогресса, есть некоторые вещи, которые я еще не совсем понимаю.

Например, я нахожу это поведение довольно запутанным:

var Employee = function Employee() { this.company = 'xyz'; };
var Manager = function Manager() { this.wage = 'high'; };

var m = new Manager();

m; // { "wage": "high", __proto__ : Manager } -- no problems so far.

Manager.prototype = new Employee();

var n = new Manager;

m.company; // undefined
n.company; // "xyz"
Свойство

m __proto__ указывает на объект, который не является Manager текущим прототипом. Это немного нелогично, учитывая, что:

Объект наследует свойства, даже если они добавлены в свой прототип после создания объекта.

Взято из JavaScript: Полное руководство, 5-е издание, Дэвид Фланаган

Не может ли это поведение быть применено и к вышеупомянутому делу?

Кто-нибудь может уточнить?

1 Ответ

4 голосов
/ 14 августа 2010

Это немного сбивает с толку, потому что функции сами являются объектами:

function Employee() {this.company = 'xyz';}
function Manager() {}

var m = new Manager();
Manager.prototype = new Employee();

/* You set the prototype on the Manager function (object), 
   your m instance and Manager function are separate objects.
   At this point the prototype of m is still undefined */

m = new Manager();
m.company; // 'xyz'

/* Creating a new Manager copies the new prototype */
...