Установка Ninja.prototype = Person.prototype;
говорит, что все Ниндзя - это Личности, а все Люди - Ниндзя , поскольку это просто заставляет два прототипа указывать на одну и ту же вещь. Таким образом, изменение Ninja.prototype
изменит Person.prototype
и наоборот.
Установка 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