我一直在使用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