Прототипы Javascript (такие как Closures, а не JQuery) - PullRequest
2 голосов
/ 08 января 2010

Я только что взял новую книгу по ASP.NET и AJAX, и в ней есть пример, подобный этому:

Person = function(firstName) {
    this._firstName = firstName;
}

Person.prototype = {
    get_FirstName = function() {return this._firstName;}
}

Я сразу заметил, что это не то, к чему я привык, и FireBug, видимо, согласен со мной, что это шатко. Я привык к чему-то вроде:

Person.protoype = {
    get_FirstName: function() {return this._firstName;}
}

Это просто опечатка со стороны автора или он может использовать функцию из библиотеки ASP.NET AJAX?

Кроме того, есть ли разница между предыдущей функцией и этой:

Person.protoype.get_FirstName = function() {
    return this._firstName;
}

Автор просто собрал два приемлемых объявления одной и той же функции?

Ответы [ 4 ]

2 голосов
/ 08 января 2010

Первый вопрос, да, я считаю, что это была опечатка.

Второй вопрос, да, есть разница. Бедный совет:

Constructor.prototype = { method : function(){} }

наследуется от анонимного объекта ({}), в котором был определен метод. Если это будет сделано во второй раз, предыдущий метод исчезнет, ​​поскольку цепочка наследования теперь будет указывать на новый анонимный объект.

Чем обычно:

Constructor.prototype.method = function(){}

просто определяет новый метод.

1 голос
/ 08 января 2010

Есть несколько проблем с примером:

  1. Person должно быть объявлено с var. Желательно всегда делать это с переменными.
  2. Опечатка, отмеченная в других ответах.
  3. Шаблон getter / setter, вероятно, под влиянием свойств C #. Если вы не делаете что-то сложное, это, вероятно, излишнее в JavaScript, и ваш код будет понятнее, если использовать свойство. Кроме того, новая спецификация ECMAScript 5 представила методы получения и установки свойств для языка, и некоторые браузеры реализовали их, но они еще недостаточно распространены для использования в Интернете.
1 голос
/ 08 января 2010

Для второй части вашего вопроса, если вы используете не назначать новый объект свойству прототипа, вы можете использовать наследование:

Person = function( ) {
};

Person.prototype = new Individual( );

Person.protoype.set_LastName = function( lastname) {
    this.lastName = lastname
};

//inherited from Individual:
Person.get_FirstName( );
1 голос
/ 08 января 2010

для вашего первого вопроса да, это опечатка или ошибка - это недопустимый JavaScript.

о вашем последнем вопросе на самом деле - это разница между двумя примерами, если к прототипу уже было что-то прикреплено. Первый, который устанавливает атрибут prototype, удалит все, что ранее было сделано с прототипом, а второй просто добавляет к тому, что уже есть. Я бы (и сделал) использовать второй способ, добавив новый атрибут к прототипу.

...