Вопрос относительно наследования в JavaScript - PullRequest
7 голосов
/ 25 января 2011

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

function Person(){} 
Person.prototype.dance = function(){}; 

function Ninja(){} 

Ninja.prototype = Person.prototype; 

и

function Person(){} 
Person.prototype.dance = function(){}; 

function Ninja(){} 


Ninja.prototype = new Person();

Я немного запутался в этих строках:

Ninja.prototype = Person.prototype; 

и

Ninja.prototype = new Person();

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

1 Ответ

14 голосов
/ 25 января 2011
  1. Установка Ninja.prototype = Person.prototype; говорит, что все Ниндзя - это Личности, а все Люди - Ниндзя , поскольку это просто заставляет два прототипа указывать на одну и ту же вещь. Таким образом, изменение Ninja.prototype изменит Person.prototype и наоборот.

  2. Установка Ninja.prototype = new Person(); говорит о том, что все ниндзя начинают с обычного человека , но Ninja.prototype можно изменить без изменения определения Person. Ключевым словом здесь является ключевое слово new, которое создает уникальный экземпляр со значением Person и поэтому может быть свободно изменено, не затрагивая ничего.


Пример Ninja.prototype = Person.prototype

Определите, что прототип Ninja совпадает с прототипом Person:

function Person() {}
Person.prototype.dance = function () {}; // A Person can dance

function Ninja() 
Ninja.prototype = Person.prototype; // Now a Ninja can dance too!

Экземпляр из Ninja обладает способностями Person:

var ninja = new Ninja();
ninja.dance();

Но , изменения в определении Ninja также влияют на случаи Person:

Ninja.prototype.kill = function () {}; // Oh no! Now a Person can kill too!
var bob = new Person();
bob.kill(); // Not what we wanted...

Пример Ninja.prototype = new Person()

Определите Person так же, как и раньше:

function Person(){};
Person.prototype.dance = function () {}; // A Person can dance

Теперь я разбью Ninja.prototype = new Person() на два шага. Сначала создайте новый Person с именем defaultNinja:

var defaultNinja = new Person(); // Despite the name, it's just a regular Person

Затем определите все Ninja s как значения по умолчанию:

function Ninja(){};
Ninja.prototype = defaultNinja; // Really the same as Ninja.prototype = new Person();

На этот раз, если мы изменим то, что Ninja s может сделать:

Ninja.prototype.kill = function () {};
// OR,
defaultNinja.kill = function () {};

Экземпляры Person не затрагиваются:

ninja.kill(); // Now the ninja can kill
var bob = new Person();
bob.kill(); // ERROR, because Person.prototype doesn't have kill(),
            // only defaultNinja does
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...