我一直在使用javascript一段時間,但從來沒有學過基本的語言。我正在閱讀John Resig的「專業Javascript技術」 - 我提出了一些問題,但我沒有在書或谷歌等網站上找到答案。Javascript中的面向對象問題
John在他的書中給出了這個例子:
功能#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());
它不使用原型屬性創建的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 - 3個功能之間有什麼區別?原型屬性的優點是什麼,函數#2做了什麼不正確的事情,因爲它似乎更直接地代碼#2而不是#1(儘管我確信#1正在做的更好,看到約翰創建它) 。
問題#2 - 如何修改函數#3以不使用setName和setAge方法,但仍保留{...}簡寫形式? {...}速記可以有構造函數嗎?
在此先感謝幫助我學習!
編輯 我覺得我的第二個問題有點混亂。我的意思是,我怎麼能使用{...}速記創建一個User對象,但後來經過我創建的對象,這樣說:
var user = new User("Bob", 44);
就像在功能#1 - 或者是不可能的?
編輯#2 哇!謝謝大家的真棒答案。這真的讓我更加清楚。所以如果我理解正確的話,#1和#2之間的差別不是太大。如果我只創建一個「用戶」對象 - 它們可能根本就沒有什麼不同。但是,如果我的程序創建了許多用戶對象,#1很可能會更有效率,並使用更少的內存,因爲所有對象都將共享相同的功能。
我真的很感謝所有的好的答案 - 謝謝!
我想我的意思是問題#2是如何修改函數#3,這樣我可以這樣說變種人=新用戶(); – BrianH 2009-01-14 18:53:44
該評論並不完全正確「所有不同的getName函數都表現完全一樣」。類型#2有權訪問私人股票交易所 – meouw 2009-01-14 20:12:32
我的觀點是他們的行爲在這個例子中是一樣的。 – Glomek 2009-01-14 20:18:01