Я смущен понятием "прототипа" в JavaScript.
Когда я определю объект оба из следующего, кажись, работать:
myObject = {};
myObject.prototype.method1 = function() { ... };
myObject.prototype.method2 = function() { ... };
myObject.prototype.method3 = function() { ... };
и...
myObject = {};
myObject.method1 = function() { ... };
myObject.method2 = function() { ... };
myObject.method3 = function() { ... };
Кто-либо мог пролить некоторый свет на это? Каково точно различие между этими двумя способами создать объект и почему я выбрал бы один по другому? (У меня есть это чувство в моем пищеварительном тракте, это важно...),
Спасибо!
Вы должны использовать свойство prototype
только в функциях конструктора , но не в экземплярах объекта , например:
function Test () {}
Test.prototype.method1 = function () {/*...*/};
var obj = new Test();
Прототип
] функции конструктора, используется оператором new
, когда он создает наш новый экземпляр объекта.
У всех нативных объектов есть скрытая ссылка, которая составляет цепочку прототипов.
Эта скрытая связь между объектами является внутренним свойством [[Prototype]]
, и только оператор new
может его установить.
В приведенном выше примере объект obj
внутренне связан с прототипом конструктора, метод method1
доступен из obj
, но физически не существует для этого объекта этот метод существует в объекте Test.prototype
, и он извлекается через цепочку прототипов , например:
typeof obj.method1; // "function"
obj.hasOwnProperty('method1'); // false
obj.method1 === Test.prototype.method1; // true
В экземплярах объекта, назначение прототипа
бессмысленно, оно будет использовано как любое другое имя свойства:
var myObject = {};
myObject.prototype = "foo";
myObject.bar = "bar";
// myObject is simply {"prototype":"foo","bar":"bar"}
Второй способ добавляет только методы к этому объекту. Первый способ делает его доступным для других объектов, созданных с помощью new
с этим «типом».