第一種方法是創建你永遠只能打算有一個的對象。這是單身人士。它直接創建student1
對象。
第二種方法是構造函數。可以一次又一次地使用構造函數來創建儘可能多的這些對象。
按照慣例,構造函數首先應該覆蓋的(例如,Student
而非student
),比如JavaScript自己的對象(Date
,RegExp
,...)。
你可以使用JavaScript原型鏈,使所有的Student
對象使用相同的dispInfo
功能(具有不同this
值),而不是爲每個對象創建dispInfo
:
function Student (a, b, c) {
this.name = a;
this.course = b;
this.grade = c;
}
Student.prototype.dispInfo = function(){
return this.name + ' has an ' + this.grade;
};
var s1 = new Student("Mary", "Algebra", "A");
var s2 = new Student("Joe", "Classical Sculpture", "B+");
由於ES5的(和對於較老的瀏覽器,這也可以用「墊片」來實現),您不必使用構造函數來使對象共享一個原型,您可以使用Object.create
來做到這一點。我更喜歡構造函數,但你也可以使用建設者功能:
var StudentPrototype = {
dispInfo: function(){
return this.name + ' has an ' + this.grade;
}
};
function BuildStudent(a, b, c) {
var student = Object.create(StudentPrototype);
student.name = a;
student.course = b;
student.grade = c;
return student;
}
var s1 = BuildStudent("Mary", "Algebra", "A");
var s2 = BuildStudent("Joe", "Classical Sculpture", "B+");
請注意,我們不使用new
與建設者的功能,只需用構造函數。 (如果你這樣做通常是無害的,但是讀取代碼的人沒有必要和誤導,所以你不想。)
或者你甚至不需要在簡單的情況下,設計器功能,您可以只使用Object.create
直接,但它是一個有點麻煩,因爲如果你在屬性描述(第二個參數)傳球,每一個有成爲一個描述財產的物體,而不僅僅是它的價值(這有一個很好的理由),所以你必須做{value: "the value"}
(當然,你可能需要來指定有關財產的其他事情,比如它是否是enumerable
等):
var StudentPrototype = {
dispInfo: function(){
return this.name + ' has an ' + this.grade;
}
};
var s1 = Object.create(StudentPrototype, {
name: {value: "Mary"},
course: {value: "Algebra"},
grade: {value: "A"}
});
var s2 = Object.create(StudentPrototype, {
name: {value: "Joe"},
course: {value: "Classical Sculpture"},
grade: {value: "B+"}
});
就個人而言,我更喜歡構造函數functio ns,但關於JavaScript的好處在於它支持多種編程風格,其中包括諸如構建器或直接使用Object.create
等更合適的編程風格。
Thx爲答案。事情是,我不會總是想要用所有參數來初始化對象。這就是爲什麼一種陣列會很好。 我知道我總是可以使用s.name =「Mary」 – 2013-04-27 09:34:58
@PaulFournel:你可以放棄那些你想離開的東西(如果它們在最後);在構造函數中,它們將是'undefined'。例如,'var s = new Student(「Mary」);'產生一個名字爲'course'和'grade'的值爲undefined的學生。你也可以將一個「選項」對象傳遞給構造函數,該構造函數從該對象的屬性中抓取它需要的東西(jQuery - 你可能已經聽說過了 - 用它作爲'$ .ajax'等等,就像其他圖書館)。 – 2013-04-27 09:40:45
@PaulFournel:或者,當然,對於你正在做的事情,你可以直接使用Object.create(參見答案的結尾)。我不是直接使用它的大粉絲,但有很多人。 :-) – 2013-04-27 09:41:28