1.1、数据属性
包含一个数据值的位置,可以进行读取和写入。
四种特性:调用Object.defineProperty(对象名,属性名,{特性名:特性值(true\false)}) // 默认false
[[Configurable]]:默认是true ,表示是否可以进行delete属性操作从新定义属性,定义为false以后
不能再设置为true,此时再次调用Object.defineProperty()除Writable之外都会导致错误
[[Witable]]:默认是true,设置是否可以修改属性的值
[[Enumerable]]:默认是true,表示能否通过for-in循环返回属性
[[Value]]:属性的属性值,默认是undefined
例如:
var person = {};
Object.defineProperty(person,'name',{
writable:false,
value:'张山'
})
console.log(person.name); // 张山
person.name = '里斯'
console.log(person.name); // 张山 并没有修改name属性的值。
Object.defineProperty(person,'name',{
configurable:false,
value:'张山'
})
// 报错
Object.defineProperty(person,'name',{
configurable:true,
value:'张山'
})
1.2、访问器属性:
不包含属性值,包含setter和getter函数(非必需的)
四种特性:
[[configuralbe]]:默认是true,表示是否可以进行delete属性操作从新定义属性,定义为false以后
不能再设置为true,此时再次调用Object.defineProperty()除Writable之外都会导致错误
[[Enumerable]]:默认是true,表示能否通过for-in循环返回属性
[[get]]:默认值是undefined,读取属性值时调用的函数
[[set]]:默认值是undefined,写入属性值时调用的函数
访问器属性不能直接定义必须由Object.defineProperty()调用
例:
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;
console.log(newValue);
}
}
})
book.year = 2005;
console.log(book.edition); //2 浏览器不支持的情况下为1
1.3、定义多个属性
Object.defineProperties(要定义属性的对象,{定义的属性1:{value:值},属性2:{value:值}})
例:
var book = {};
Object.defineProperties(book,{
_year:{
value:2004
},
edition:{
value:1
},
year:{
set:function(newValue){
this._year = newValue;
this.edition += newValue - 2004;
},
get:function(){
return this._year;
}
}
})
book.year = 2005;
console.log(book.edition); //2 浏览器不支持的情况下为1
此时属性的创建时间是在同一时间
转载于:https://www.cnblogs.com/hyf120/p/9177962.html