创建自定义对象对简单的办法就是创建一个Object实例,如下所示。
var person = new Object();
person.name = 'Jack';
person.age = 20;
person.sayName = function(){
alert(this.name);
}
person.sayName(); //输出Jack
上面的例子用对象字面量语法可以写成:
var person = {
name: 'Jack',
age: 20,
sayName: function(){
alert(this.name);
}
};
person.sayName(); //输出Jack
ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征。这些特性是为了实现JavaScript引擎用的,因为不能直接访问。为了表示是内部值,他们被放在两对方括号里面,如[[Enumerable]]。
ECMAScript中有两种属性:数据属性和访问器属性。
数据属性包含一个数据值的位置,可读取和写入值。数据属性有4个特性。
|
特性 |
意义 |
默认值 |
|
[[Configurable]] |
能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。 |
true |
|
[[Enumerable]] |
能否通过for-in循环返回属性 |
true |
|
[[Writable]] |
能否修改属性值 |
true |
|
[[Value]] |
这个属性的属性值 |
undefined |
用Object.defineProperty(‘属性所在对象’,’属性名称’,’描述符对象’)方法来修改属性默认的特性。描述符对象属性为:configurable, enumerable, writable, value。例如:
var person = {
age: 20,
sayName: function(){
alert(this.name);
}
};
Object.defineProperty(person,"name",{
configurable: false,
writable: false,
enumerable: false,
value: 'Jack'
});
for( var i in person){
console.log(person[i]);
};
person.sayName();
writable设置为false,则无法再修改该属性的value值(否则严格模式报错)。
configurable设置为false, 则无法删除该属性(否则严格模式报错),无法设置除writeable以外的特性(否则报错)。
在使用Object.defineProperty()后,configurable, writable, enumerable将默认为false.
不支持IE8-
访问器属性值不包含数据值,无writable和value。
|
特性 |
意义 |
默认值 |
|
[[Configurable]] |
能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。 |
true |
|
[[Enumerable]] |
能否通过for-in循环返回属性 |
true |
|
[[Get]] |
读取属性时调用的函数 |
undefined |
|
[[Set]] |
写入属性时调用的函数 |
undefined |
访问器属性和数据属性一样通过Object.defineProperty()来定义,例如。
var book = {
name: 'book',
_year: 2015,
edition: 1
}
Object.defineProperty(book, "year", {
get: function(){
return this._year ;
},
set: function(newValue){
if(newValue > 2015){
this._year = newValue;
this.edition += newValue - 2015;
}
}
});
book.year = 2016;
alert(book.year);
console.log(book.edition + ' ' + book.year);
_year前面的下划线是一种常用的记号,用于表示只能通过对象方法访问的属性,当我们为person.name赋值时调用了getter和setter。
只设置getter意味属性不能写(严格模式报错)。
只设置setter意味属性不能读(严格模式报错)。
定义多个属性使用Object.defineProperties(‘属性所在对象’,’属性对象’),例如:
var book = {};
Object.defineProperties(book,{
name: {
configurable: false,
writable: false,
value: 'book'
},
_year: {
configurable: true,
writable: true,
value: 2015
},
edition: {
configurable: true,
writable: true,
value: 1
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2015){
this._year = newValue;
this.edition += newValue - 2015;
}
}
}
});
book.year = 2017;
console.log(book.edition);
不支持IE8-;
在使用Object.defineProperties()后,configurable, writable, enumerable将默认为false。
用Object.getOwnPropertyDescriptor(‘属性所在的对象’,’属性的名称’)方法取得属性的描述符对象,例如:
var book = {};
Object.defineProperties(book,{
name: {
value: "book"
},
_year: {
value: 2015
},
edition: {
value: 1
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2015){
this._year = newValue;
console.log(newValue);
console.log(this._year);
this.edition += newValue - 2015;
};
}
}
});
var desciptor = Object.getOwnPropertyDescriptor(book,"year");
console.log(desciptor.get + " " + desciptor.configurable + " " + desciptor.set + " " + desciptor.enumerable);
不支持IE8-;