Это может поразить вас как грамматически неправильный и, возможно, безумный вопрос, но вот что я имею в виду: пытаясь понять концепцию prototype
в JavaScript, я столкнулся с примерами, которые были несколько более или менее сложными версиями следующих
//Guitar function constructor
function Guitar(color, strings) {
this.color = color;
this.strings = strings;
}
//Create a new instance of a Guitar
var myGuitar = new Guitar('Black', ['D', 'A', 'D', 'F', 'A', 'E']);
//Adding a new method to Guitar via prototype
Guitar.prototype.play = function (chord) {
alert('Playing chord: ' + chord);
};
//Now make use of this new method in a pre-declared instance
myGuitar.play('D5');
Итак, к моей проблеме: Почему, черт возьми, вы хотели бы это сделать? Почему бы вам не просто поместить функцию play
в Guitar
для начала? Зачем объявлять экземпляр и затем добавлять методы позже? Единственная причина, по которой я могу видеть, - это если вы хотите, чтобы myGuitar
не имел доступа к play
, когда он изначально был создан, но я не могу придумать ни одного примера, объясняющего причину, почему вы хотите что-то вроде этого.
Похоже, было бы более полезно сделать это:
function Guitar(color, string) {
this.color = color;
this.strings = strings;
this.play = function (chord) {
alert('Playing chord: ' + chord);
};
}
var myGuitar = new Guitar('White', ['E', 'A', 'D', 'G', 'B', 'E']);
myGuitar.play('E7#9');
Реальная проблема здесь в том, что второй пример имеет смысл для меня, в то время как в первом примере этого нет, тогда как на самом деле первый пример, вероятно, лучше по какой-то причине (-ам). К сожалению, каждый учебник, который я когда-либо нашел, просто проходит через шаги prototype
, но не почему парадигма prototype
существует вообще для начала.
Кажется, что prototype
позволяет делать то, что вы в противном случае не могли бы сделать, но я не могу придумать никаких веских причин, почему вы хотели бы их сделать.
Изменить: Некоторые ответы:
- Когда я сказал: "Зачем объявлять экземпляр, а потом добавлять методы позже?" Я больше критиковал все примеры, которые я вижу, которые играют в порядке моего первого примера. Когда этот порядок изменен, как и в приведенном ниже ответе Harmen, он визуально визуально визуализирует немного больше. Однако это не меняет того факта, что в том же духе, что и в моем первом примере, вы можете создать пустой конструктор объектной функции, объявить 100 экземпляров этого объекта, а затем только после этого определить, каков исходный объект на самом деле, методов и свойств через
prototype
. Возможно, это обычно делается таким образом, чтобы намекнуть на идею "Копировать против ссылки", описанную ниже. - На основании нескольких ответов, вот мое новое понимание: если вы добавите все свои свойства и методы в конструктор объектной функции, затем создайте 100 экземпляров этого объекта, вы получите 100 копий всех свойств и методов. Вместо этого, если вы добавите все свои свойства и методы в конструктор конструктора объектов
prototype
, затем создайте 100 экземпляров этого объекта, вы получите 100 ссылок на единственную (1) копию свойств объекта и методов. Это, очевидно, быстрее и эффективнее, и поэтому используетсяprototype
(помимо изменения таких вещей, какString
иImage
, как указано ниже). Итак, почему бы не сделать это:
(Маркированные списки ломают любой код сразу после них, по-видимому, поэтому я должен добавить строку отдельного текста здесь)
function Guitar(color, strings) {
this.prototype.color = color;
this.prototype.strings = strings;
this.prototype.play = function (chord) {
alert('Playing chord: ' + chord);
};
}
var myGuitar = new Guitar('Blue', ['D', 'A', 'D', 'G', 'B', 'E']);
myGuitar.play('Dm7');