創建javascript對象可以通過兩種方式:創建Object對象和創建字面量對象。
/**
* 面向對象
*/
/** 創建對象 **/
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Soft Engineer";
person.sayName = function() {
console.log(this.name);
};
/** 字面量方式 **/
var person1 = {
name: "Nicholas",
age: 29,
job: "Soft Engineer",
sayName: function() {
console.log(this.name);
}
};
Javascript 對象屬性的特性
對象的屬性特性,可以通過Object.defineProperty(object, property, descritor)設置:
configurable ,屬性是否可配置。可配置的含義包括:是否可以刪除屬性( delete ),是否可以修改屬性的 writable 、enumerable 、 configurable 屬性。
enumerable ,屬性是否可枚舉。可枚舉的含義包括:是否可以通過 for...in 遍歷到,是否可以通過 Object.keys() 方法獲取屬性名稱。
writable ,屬性是否可重寫。可重寫的含義包括:是否可以對屬性進行重新賦值。
value ,屬性的默認值。
使用Object.defineProperty方法定義configurable、 enumerable、 writable 特性時,沒有指定的特性默認是false
//"use strict"; //嚴格模式
/**
* 面向對象 - 對象屬性的數據屬性
* 數據屬性包含一個數據值的位置,在這個位置可以讀取和寫入值,數據屬性4個特性: Configurable, Enumerable, Writable, Value 。
* Configurableb 表示是否能修改屬性的其它特性,或使用delete刪除屬性,默認為true。
* Enumerable 是否能通過for in 循環列舉出對象的該屬性,默認true。
* Writable 能否修改屬性的值(也即是下面的Value值),默認true。
* Value 表示屬性的數據值,默認是undefined(未賦值)
*/
// 創建一個對象
var person = {
name: "Nicholas"
};
/**
* 上面創建了一個名稱為person的對象,屬性name的4個特性:Configurable(true),Enumerable(true), Writable(true), Value("Nicholas")。
*/
/**
* 修改屬性的默認特性,Object.defineProperty(obj, propertyName, descObj)
* 接受3個參數:屬性所在對象,屬性名,屬性特性描述符對象,如下
*/
Object.defineProperty(person, "name", {
writable: false, // 是否能修改name屬性,false 即是只讀狀態
value: "Nick"
});
console.log(person.name); //Nick
//屬性特性writable設置為false,這裡無法修改name屬性的值,嚴格模式下會拋出不會出現報錯。非嚴格模式會被忽略,name還是Nick。
person.name = "James"; // 設置無效
console.log(person.name); // Nick
Object.defineProperty(person, "name", {
writable: true
});
person.name = "James";
console.log(person.name); //James
/**
* configurable 一旦將屬性設置為false,將不能在設置為true
*/
Object.defineProperty(person, "name", {
configurable: false // 不能通過delete刪除屬性
});
// 拋出錯誤
/**
Object.defineProperty(person, "name", {
configurable: true
}); **/
delete person.name; // 非嚴格模式無效,嚴格模式拋錯
console.log("name = " + person.name);
set ,一旦屬性被重新賦值,此方法被自動調用。
get ,一旦屬性被訪問讀取,此方法被自動調用。
var book = {
_year: 2004,
edeition: 1
};
// 定義屬性year,用來訪問_year
Object.defineProperty(book, "year", {
get: function() {
console.log("execute get");
return this._year;
},
set: function(newValue) {
console.log("execute set");
if (newValue > 2004) {
this._year = newValue;
this.edeition += newValue - 2004;
}
}
});
對象的屬性特性:數值特性和訪問器特性。數值特性configurable、enumerable、writable、value,代表值和狀態。訪問器特性沒有值,只有一對方法get和set。