1、js的中没有OO语言中的'类'的概念。ECMAjs中把对象定义为:‘无序属性的集合,其属性可以包含基本值,对象或函数’。
2、ECMAScript中为对象定义了一组只有内部可以使用的属性,这些属性的目的是为了描述外部定义的属性的各种特征。这些特征是为了实现JS引擎用的,
因此再JS中不能不能直接访问它们。为了表示这个特性是内部值,把他们放到了两对中括号中,例如[[Enumerable]]。
数据属性:
[[Configurable]]:可配置性,默认为true,描述这个数据属性是否可以被delete,从而重新定义属性、描述了能否修改属性的特性,能否把属性改为访问器属性
[[Enumerable]]:可遍例(for-in)性,默认为true。
[[Writable]]:可修改性。默认为true
[[Value]]::在此保存数据。默认为undefined.
var person = {};
Object.defineProperty(person, "name", {//要修改属性的默认特性。必须使用Object.definedProperty()
writable: false;
value: 'Nicholas'
});
alert(person.writable);//Nicholas
person.name = 'wang';
alert(person.writable);//Nicholas
访问器属性:(不包含数据值,包含一对getter,setter函数)
[[Configurable]]:可配置性,默认为true,描述这个属性是否可以被delete,从而重新定义属性、描述了能否修改属性的特性,能否把属性改为访问器属性
[[Enumerable]]:可遍例(for-in)性,默认为true。
[[Get]]:在读取属性时调用的函数。默认值为undefined
[[Set]]:在写入属性时调用的函数。默认值为undefined
var person={
_age = 10,
addAge = 1
};
Object.defineProperty(person, 'age',{
get: function(){
return this._age;
},
set: function(newValue){
if(newValue > 10){
_age = newValue;
addAge = newValue - 10;
}
}
});
person.age = 12;
alert(person.addAge);//2
除了一次性修改一个属性的特性方法:Object.defineProperty();还有另一个更加强大的方法:Object.defineProperties();可以一次性修改多个属性的特性。
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},edition: {
value: 1
},year:{
get: function(){
return this._year;
},set: function(newValue){
if(newValue > 2004){
this._year = newValue;
this.edtion += newValue - 2004;
}
}
}
});
book.year = 2005;
alert(book.edition);//2