对象属性
属性类型
JavaScript中有三种不同类型的对象属性:命名数据属性、命名访问器属性以及内部属性。
var person={
name:keency,
get age(){},
set age(){}
}
var book={
_year:2004,
edition:1
}
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
this._year=newValue;
}
});
(1)命名数据属性:name、edition
(2)命名访问器属性:age、_year
下划线用于表示只能通过对象方法访问的属性。
(3)内部属性:[[prototype]] 、[[class]]、 [[extensible]]
extensible用于定义对象上的属性是否可添加。
①preventExtensions(obj) 设置属性不可添加。
②Object.seal(obj)除执行preventExtensions(obj)将所有属性的configurable设置为false。
③Object.freeze(obj)在Object.seal(obj)的基础上将所有属性的writable设置为false。
属性特性
特性 | 含义 | 特点 |
---|---|---|
configurable | 是否可配置 | 设置configurable为false后只能将writable由true变为false |
writable | 是否可写 | |
enumerable | 是否可枚举 | 当设置该属性特性为false后使用for in遍历不出该属性 |
value | 属性的值 | |
get | 属性 | 存储着getter |
set | 属性 | 存储着setter |
添加属性
给对象添加属性可直接赋值也可使用defineProperty方法。
直接赋值的特殊情况:
①原型链上有该属性的set方法
直接赋值添加属性不成功,因为调用了原型链上的set
②原型链上该属性的writable为false
以上只能通过defineProperty(对象,属性,属性的特性)来给对象添加属性。
删除属性
删除对象属性可以使用delete(configurable为true的情况下)。
属性操作常用函数
Object.defineProperty(obj,newDataProperty: { writable: false })
//defineProperty,如果不指定属性特性,默认configurable、enumerable和writable特性都为false
Object.defineProperty(a,"b",{
value:123
})
Object.defineProperties(obj, {
newDataProperty: { writable: false },
newAccessorProperty: { enumerable: false },
anotherDataProperty: { value: "abc" }
});
Object.getOwnPropertyDescriptor(obj,"属性名");
Object.getOwnPropertyDescriptors(obj);//获取所有属性的描述
obj.hasOwnProperty("属性名");
hasPrototypeProperty(obj,"属性名");//查找该属性是否在原型对象中