數(shù)據(jù)屬性
- Configurable
表示能否通過(guò)delete刪除屬性挪挤,從而重新定義屬性叼丑,能否修改屬性的特性,或者能否把屬性修改為訪問(wèn)器屬性扛门。默認(rèn)值為true
- Enumerable
表示能否通過(guò)for-in循環(huán)返回屬性鸠信。默認(rèn)值為true
- Writable
表示能否修改屬性的值,默認(rèn)值為true
- Value
包含這個(gè)屬性的數(shù)據(jù)值论寨,默認(rèn)值為undefined
定義屬性
var person = {}
Object.defineProperty{person, "name", {
writable: false,
value: "Nicholas"
}};
將configurable特性設(shè)置為false之后就不能再設(shè)置為true了
調(diào)用Object.defineProperty()方法創(chuàng)建一個(gè)新的屬性時(shí)星立,如果不指定,configurable,enumerable,writable特性的默認(rèn)值都為false
訪問(wèn)器屬性
- Configurable
- Enumerable
- Get
- Set
var book = {
_year: 2004,
edition: 1
};
object.defineProperty(book, "year", {
get: function() {
return this._year;
},
set: function(newValue) {
if(newValue > 2004) {
this._year = newValue;
this.edition += newValue -2004;
}
}
})
book.year = 2005;
alert(book.edition); // 2
創(chuàng)建對(duì)象
工廠模式
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
alert(this.name);
}
return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");
構(gòu)造函數(shù)模式
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
alert(this.name);
}
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
// 實(shí)例對(duì)象的constructor(構(gòu)造函數(shù))屬性指向Person
alert(person1.consturctor == Person) // true
alert(person2.constructor == Person) // true
用new創(chuàng)建構(gòu)造函數(shù)新實(shí)例葬凳,經(jīng)歷4個(gè)步驟
- 創(chuàng)建一個(gè)新對(duì)象
- 將構(gòu)造函數(shù)的作用域賦給新對(duì)象(this指向這個(gè)新對(duì)象)
- 執(zhí)行構(gòu)造函數(shù)中的代碼(為新對(duì)象添加屬性)
- 返回新對(duì)象
instanceof 操作符用于標(biāo)識(shí)對(duì)象類型
alert(person1 instanceof Object); // true
alert(person1 instaceof Person); // true
原型模式
function Person () {}
Person.prototype.name = 'Nicholas';
Person.prototype.age = 29;
Person.prototype.job = 'Software Engineer';
Person.prototype.sayName = function() {
alert(this.name);
}
var person1 = new Person();
person1.sayName(); // 'Nicholas'
var person2 = new Person();
Person2.sayName(); // 'Nicholas'
可以通過(guò)isPrototypeOf()方法來(lái)確定對(duì)象之間的關(guān)系
alert(Person.prototype.isPrototypeOf(person1)) // true
alert(Person.prototype.isPrototypeOf(person2)) // true
可以通過(guò)Object.getPrototypeOf()方法返回[[prototype]]的值
alert(Object.getPrototypeOf(person1) == Person.prototype) // true
alert(Object.getPrototypeOf(person1).name) // true
通過(guò)hasOwnProperty()方法檢測(cè)屬性是否存在實(shí)例中
person1.name = 'Greg';
alert(person1.hasOwnProperty("name")) // true
delete(person1.name)
alert(person1.hasOwnProperty("name")) // false
in操作符绰垂,通過(guò)對(duì)象能夠訪問(wèn)到給定屬性時(shí)返回true
alert(person1.hasOwnProperty("name")) // false
alert("name" in person1) // true