Я уже некоторое время использую javascript, но никогда не изучал язык без основ. Я читаю «Техники Pro Javascript» Джона Резига - я задаю некоторые вопросы, но я не нахожу ответы на них в книге, в Google и т. Д.
Джон приводит этот пример в своей книге:
Функция # 1
function User( name, age ){
this.name = name;
this.age = age;
}
// Add a new function to the object prototype
User.prototype.getName = function(){
return this.name;
};
User.prototype.getAge = function(){
return this.age;
};
var user = new User( "Bob", 44 );
console.log("User: " + user.getName() + ", Age: " + user.getAge());
Я все еще изучаю свойство prototype , поэтому я попытался написать что-то подобное:
Функция # 2
function User (name, age ) {
this.name = name;
this.age = age;
this.getName = function() {
return this.name;
};
this.getAge = function() {
return this.age;
};
}
var user = new User( "Bob", 44 );
console.log("User: " + user.getName() + ", Age: " + user.getAge());
Он не использует свойство prototype для создания функций getName и getAge, но вывод такой же, как в примере с Джоном.
Я сделал еще один шаг и создал это:
Функция # 3
var User = {
name: "",
age: 0,
setName: function(name) {
this.name = name;
},
setAge: function(age) {
this.age = age;
},
getName: function() {
return this.name;
},
getAge: function() {
return this.age;
}
};
User.setName("Bob");
User.setAge(44);
console.log("User: " + User.getName() + ", Age: " + User.getAge());
Опять же - это выглядит иначе, чем в примере с Джоном (и мне пришлось добавить методы установки), но вывод такой же.
Вопрос № 1 - в чем разница между тремя функциями? В чем преимущество свойства prototype, и в том, что функция # 2 делает что-то неправильно, потому что кажется, что код # 2 более прост, чем # 1 (хотя я уверен, что # 1 делает это лучше, поскольку Джон его создал) .
Вопрос № 2 - Как я могу изменить функцию # 3, чтобы не использовать методы setName и setAge, но при этом сохранить стенографию {...}? Могут ли сокращения {...} иметь конструкторы?
Заранее спасибо за помощь в обучении!
EDIT
Я думаю, что мой второй вопрос был немного запутанным. Я имел в виду, как я мог использовать сокращение {...} для создания объекта User, но затем, после создания объекта, произнесите что-то вроде:
var user = new User("Bob", 44);
Так же, как в функции # 1 - или это невозможно?
РЕДАКТИРОВАТЬ # 2
Вот Это Да! Спасибо всем за потрясающие ответы. Это действительно делает это намного более ясным для меня. Так что, если я правильно понимаю, разница между № 1 и № 2 не слишком велика. Если я только когда-либо создаю один объект «Пользователь» - они, вероятно, не отличаются вообще. Но если моя программа создаст много объектов User, # 1, скорее всего, будет более эффективным и использует меньше памяти, так как все объекты будут иметь одинаковые функции.
Я действительно ценю все отличные ответы - Спасибо!