Javascript: Что такое многоуровневая иерархия прототипов и почему мы должны избегать ее - PullRequest
1 голос
/ 14 января 2012

В Руководстве по кодированию Google Javascript говорится, что мы не должны использовать многоуровневые иерархии прототипов, потому что «Эти иерархии намного сложнее понять, чем они кажутся в первый раз!».На самом деле я не понял, что это значит.Где я могу найти хороший пример, чтобы объяснить его использование и проиллюстрировать его плохой эффект?

Ответы [ 3 ]

5 голосов
/ 14 января 2012

Это пример двухуровневого наследования:

// 1. level constructor
var Dog = function ( name ) {
    this.name = name;
};

Dog.prototype.bark = function () { /* ... */ };

// 2. level constructor
var TrainedDog = function ( name, level ) {
    Dog.apply( this, arguments ); // calling the super constructor
    this.level = level;
};

// set up two-level inheritance
TrainedDog.prototype = Object.create( Dog.prototype );
TrainedDog.prototype.constructor = TrainedDog;

TrainedDog.prototype.rollOver = function () { /* ... */ };

// instances
var dog1 = new Dog( 'Rex' );
var dog2 = new TrainedDog( 'Rock', 3 );

Здесь dog1 наследует метод bark от прототипа Dog, а dog2 наследует как этот метод (от прототипа Dog), так и метод rollOver от прототипа TrainedDog.

2 голосов
/ 14 января 2012

Я полагаю, что статья имеет в виду не ручную настройку цепочек прототипов, а использование библиотеки, например goog.inherits или util.inherits

вручную вам придется сделать

var Child = function Child() { ... };

Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
// for some common value of extend
extend(Child.prototype, {
  ...
});

Это можно упростить до

var Child = function Child() { ... };

goog.inherits(Child, Parent);
extend(Child.prototype, {
  ...
});

Обратите внимание: goog.inherits также имеет дело с эмуляцией Object.create в устаревших браузерах.

0 голосов
/ 14 января 2012

Это связано с проблемой разрешения цепочки прототипов.Если у вас есть что-то вроде foo.bar, это не означает, что свойство bar принадлежит непосредственно объекту foo, поэтому оно начинает поиск bar в цепочке прототипов foo.Если цепочка длинная, разрешение свойства может быть относительно длинной операцией.

...