Когда следует использовать «прототип» во время дополнения объекта в JavaScript? - PullRequest
5 голосов
/ 16 февраля 2010

Я запутался в понятии "прототип" в javascript.

Когда я определяю объект, кажется, что работает следующее:

myObject = {};
myObject.prototype.method1 = function() { ... };
myObject.prototype.method2 = function() { ... };
myObject.prototype.method3 = function() { ... };

и ...

myObject = {};
myObject.method1 = function() { ... };
myObject.method2 = function() { ... };
myObject.method3 = function() { ... };

Может ли кто-нибудь пролить свет на это? В чем разница между этими двумя способами создания объекта и почему я выбрал бы один из других? (У меня такое чувство в животе, это важно ...)

Спасибо!

Ответы [ 2 ]

8 голосов
/ 16 февраля 2010

Вы должны использовать свойство prototype только в Функции конструктора , а не в экземплярах объекта , например:

function Test () {}
Test.prototype.method1 = function () {/*...*/};

var obj = new Test();

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

Все нативные объекты имеют скрытую ссылку, которая создает цепочку прототипов.

Эта скрытая связь между объектами является внутренним свойством [[Prototype]], и только оператор new может установить его.

В приведенном выше примере obj внутренне связан с его прототипом конструктора, method1 доступен из obj, но физически для этого объекта не существует, этот метод существует для Test.prototype объект, и он извлекается через цепочку прототипов , например:

typeof obj.method1; // "function"
obj.hasOwnProperty('method1'); // false
obj.method1 === Test.prototype.method1; // true

На экземплярах объекта присвоение свойства prototype не имеет смысла, оно будет принято так же, как и любое другое имя свойства:

var myObject = {};
myObject.prototype = "foo";
myObject.bar = "bar";

// myObject is simply {"prototype":"foo","bar":"bar"}
1 голос
/ 16 февраля 2010

Второй способ добавляет методы только к этому объекту. Первый способ делает его доступным для других объектов, созданных с помощью new с этим «типом».

...