Я использую javascript какое-то время, но никогда не изучал язык за пределами основ. Я читаю John Resig "Про Javascript Techniques" - я придумываю некоторые вопросы, но я не нахожу ответы на них в книге или на 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());
Я все еще узнаю о свойстве прототипа, поэтому я попытался написать что-то похожее:
Функция # 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());
Опять же - он выглядит иначе, чем пример Джона (и мне пришлось добавлять методы setter), но результат тот же.
Вопрос № 1 - в чем разница между тремя функциями? В чем преимущество свойства прототипа, и функция №2 делает что-то неправильно, потому что кажется, что более строгий код # 2 вместо # 1 (хотя я уверен, что # 1 делает это лучше, когда Джон создал его).
Вопрос № 2. Как мне изменить функцию № 3, чтобы не использовать методы setName и setAge, но сохраните {...} стенографию? Может ли сокращение {...} содержать конструкторы?
Заранее благодарим за помощь в изучении!
ИЗМЕНИТЬ Я думаю, что мой второй вопрос был немного запутанным. Я имел в виду, как я мог бы использовать {...} стенографию для создания объекта User, но затем после создания объекта скажу что-то вроде:
var user = new User("Bob", 44);
Как и в функции # 1 - или это невозможно?
РЕДАКТИРОВАТЬ # 2 Вау! Спасибо всем за потрясающие ответы. Это действительно делает его намного более понятным для меня. Поэтому, если я правильно понимаю, разница между # 1 и # 2 не слишком велика. Если я создаю только один объект "Пользователь", они, вероятно, совсем не отличаются друг от друга. Но если моя программа создает много объектов User, # 1, скорее всего, будет более эффективной и использовать меньше памяти, поскольку все объекты будут использовать одни и те же функции.
Я очень ценю все замечательные ответы - Спасибо!