Каковы преимущества размещения материала на прототипе объекта? Например, эти две реализации ChessPiece
кажутся очень похожими. Каковы компромиссы?Зачем ставить метод на прототипе объекта?
Без прототипа
var ChessPiece = function(x, y) {
var self = this;
this.x = x;
this.y = y;
this.getNotation = function() {
return 'abcdefgh'[self.x] + '12345678'[self.y];
};
}
var pawn1 = new ChessPiece(1, 0);
pawn1.getNotation(); // 'b1';
С прототипом
var ChessPiece = function(x, y) {
this.x = x;
this.y = y;
}
ChessPiece.prototype.getNotation = function() {
return 'abcdefgh'[this.x] + '12345678'[this.y];
}
var pawn2 = new ChessPiece(1, 1);
pawn2.getNotation(); // 'b2'
Для меня наиболее существенная разница в том, что, когда getNotation
на прототипе ChessPiece
«s, этот метод разделяет все экземпляров. Когда это не на прототипе, есть несколько копий getNotation
. Это имеет значение? Я больше не хватает?
В качестве аргумента в пользу причины, по которой я предпочитаю первый метод, является то, что писать все в одной функции конструктора проще, чем объявлять ChessPiece
, а затем назначать каждый метод на отдельные строки. Есть ли способ обойти эту проблему, если последняя предпочтительнее?
Добавление метода к прототипу заставляет все экземпляры совместно использовать эту функцию для своего свойства. В противном случае вы создаете новую (другую) функцию для каждого экземпляра и назначаете ее как свойство. Кроме того, настройка свойства внутри конструктора дает доступ к «приватным» переменным, а также истинному «этому» экземпляра, если он выполняется правильно; прототипы не имеют доступа к «приватным» переменным и не гарантируют получение истинным значением этого значения this this this this this this this this – Ian
еще одной информации, прочитанной: http://stackoverflow.com/questions/4736910/javascript-when-to-use -prototypes – Ian
и окончательное чтение из простого поиска в Google: http://stackoverflow.com/questions/4691044/should-i-use-prototype-or-not – Ian