在經典麵向對象編程語言中,Constructor是一種在內存已分配給該對象的情況下,用於初始化新創建對象的特殊方法。在JavaScript中,幾乎所有東西都是對象,我們通常最感興趣的是object構造器。
Object構造器用於創建特定類型的對象—準備好對象以備使用,同時接收構造器可以使用的參數,以在第一次創建對象時,設置成員屬性和方法的值(見圖9-1)。
圖9-1 Constructor(構造器)模式
9.1.1 對象創建
在JavaScript中,創建新對象的兩種常用方法如下所示:
//下麵每種方式都將創建一個新的空對象var newObject = {};
// object構造器的簡潔記法
var newObject = new Object();
在Object構造器為特定的值創建對象封裝,或者沒有傳遞值時,它將創建一個空對象並返回它。
有四種方法可以將鍵值賦值給一個對象:
// ECMAScript 3兼容方式
// 1. “點”語法
// 設置屬性
newObject.someKey = "Hello World";
// 獲取屬性
var key = newObject.someKey;
// 2. 中括號語法
// 設置屬性
newObject["someKey"] = "Hello World";
// 獲取屬性
var key = newObject["someKey"];
// 隻適用ECMAScript 5 的方式
// 更多信息查看:http://kangax.github.com/es5-compat-table/// 3. Object.defineProperty
// 設置屬性
Object.defineProperty(newObject, "someKey", {
value: "for more control of the property's behavior",
writable: true,
enumerable: true,
configurable: true
});
// 如果上麵的看著麻煩,可以使用下麵的簡便方式
var defineProp = function (obj, key, value) {
config.value = value;
Object.defineProperty(obj, key, config);
};
// 使用上述方式,先創建一個空的person對象
var person = Object.create();
// 然後設置各個屬性
defineProp(person, "car", "Delorean");
defineProp(person, "dateOfBirth", "1981");
defineProp(person, "hasBeard", false);
//4.Object.defineProperties
// 設置屬性
Object.defineProperties(newObject, {
value: "Hello World",
writable: true
},
"anotherKey": {
value: "Foo bar",
writable: false
}
});
// 可以用1和2中獲取屬性的方式獲取3和4方式中的屬性"someKey": {
正如我們將在本書稍後看到的,這些方法甚至可以用於繼承,如下所示:
// 用法