属性添加原理
- 一个对象首次添加某一属性时,是调用对象内部的put方法
- 一个对象修改某一属性是,是调用对象内部的set方法
属性是否存在
- 使用 in 方法时,会检测【自有属性】+【原型属性】
- 使用 hasOwnProperty 仅会检测【自有属性】
-
使用 if 语句检测是不准备的
,因为无法过滤假值
var obj = {
name:"zk",
age :19,
id:0
}
console.log( "name" in obj);//true
console.log(obj.hasOwnProperty("name"));//true
console.log(Boolean(obj.id));//false
删除对象属性用 delete
- 仅能删除自有属性,不能删除原型属性
属性遍历
- 新添加的属性默认是【可枚举的】
- for in 循环会遍历【自有属性】+【原型属性】
- in 循环会遍历【自有属性】+【原型属性】
- Object.keys() 循环仅会遍历【自有属性】
对象属性类型
- 数据属性。包含一个值
- 访问器属性。包含数据属性的值,还有读写(get、set)时调用的函数
- 当你希望【读取】或【赋值】操作会触发一些行业时,才会使用sgetter和setter方法
例子
- 注意!_name属性不可改为name,否则会造成内存益出!
- 注意!get name方法其实已经为person声明了一个name属性了
var person = {
age:19,
_name:"gs",
get name(){
console.log("reading");
return this._name
},
set name(val){
console.log("setting name is ",val);
this._name = val;
}
}
//注意,上边的_name属性不可改为name,否则会造成内存益处!!!
//注意,这里,已经生成了name属性,同时有_name和name两个属性
console.log(person);//{ "age": 19, "_name": "gs", "name": "gs" }
person.name = "zk";
console.log(person);
属性特征
访问器属性
- enumerable | configurable | get | set
数据属性
- enumerable | configurable | value | writable
enumerable 是否可遍历
- for in 查找不到该属性。但是 in 方法可以判断
configurable 是否可配置
- 设为false时,不可用 delete 删除
- 设为false时,将无法再更改为可配置
value 属性的值
writable 是否可写入
Object.defineProperty 定义属性
Object.defineProperties 同时定义多属性
- 定义新属性时,必须要赋值,否则布尔型的特征会默认为 false
- 有3个参数,对象 | 属性名 | 特征参数对象
var person = {
age:19,
_name:"gs",
get name(){
console.log("reading");
return this._name
},
set name(val){
console.log("setting name is ",val);
this._name = val;
}
}
//注意,上边的_name属性不可改为name,否则会造成内存益处!!!
//注意,这里,已经生成了name属性,同时有_name和name两个属性
console.log(person);//{ "age": 19, "_name": "gs", "name": "gs" }
person.name = "zk";
console.log(person);
for(key in person){
console.log(key);
}
Object.defineProperty(person,"name",{
enumerable:false
})
Object.defineProperty(person,"age",{
configurable:false
})
for(key in person){
console.log(key);
}
delete person.age;
console.log(person.age);
Object.getOwnPropertyDescriptor 获取属性特性
- 两个参数,1 为对象,2 为对象属性
Object.getOwnPropertyNames 获取属性名称
- 参数为对象。返回值为所有属性名的数组
Object.getOwnPropertySymbols es6
Object.preventExtensions 使对象不可扩展
Object.isExtensible 判断是否可扩展
- 参数均为对象
Object.seal 封印对象
Object.isSealed 判断对象是否被封印
- 被封印对象是不可扩展的,且所有属性都不可配置
Object.freeze 冻结对象
Object.isfrozen 判断对象是否被冻结
- 是一个封印对象 + 数据属性都为只读的对象
- 被冻结对象无法解冻
版权声明:本文为qq_38310712原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。