一、Object.defineProperty()函数和Object.hasOwnProperty()函数
- Object.defineProperty()函数
(1)概念:将属性添加到对象上,或修改现有的属性
(2)语法:Object.definedProperty(object,propertyname,descriptor)
(3)参数:
- object:必需。被添加或被修改的属性。
- propertyname:必需。一个包含属性名的字符串。
- descriptor:属性描述符。
(4)返回值:已修改的对象。
(5)用法:
- 向对象添加新属性。当对象不具有指定的属性名称时,发生此操作。
- 修改现有的属性特征。当对象具有指定的属性名称时,发生此操作。
(6)举例:
- 设置一个新的属性
代码如下:
var obj={name:'John'};
//设置一个新属性
Object.defineProperty(obj,'newDateProperty',{
value:101,
});
console.log(obj);
结果如下:
- 设置新属性并修改新属性的值
代码如下:
var obj={name:'John'};
//设置一个新属性
Object.defineProperty(obj,'newDateProperty',{
value:101,
writable:true
});
//修改新属性的值
obj.newDateProperty=111;
console.log('property value:'+obj.newDateProperty);
结果:设置了writable属性为true才可以修改新属性的值。
2.Object.hasOwnProperty()函数
(1)概念:检测是否是原型链的属性,如果是则返回false,不是则返回true(也就是自己自定义的属性)。
(2)语法:object.hasOwnProperty(propertyName)
(3)参数:propertyName:String类型,指定的属性名称。
(4)例子:
- 是否可以检测出自定义的属性和方法
代码如下:
//定义一个对象并设置属性
const person={
name:'小明',
say:function(){
console.log('说话啦')
}
}
//打印是否存在name属性
console.log("name:"+person.hasOwnProperty("name"));
//打印是否存在say方法
console.log("say:"+person.hasOwnProperty("say"));
结果:可以检测出自定义存在的属性和方法
- 是否可以检测出原型链中定义的属性和方法
代码如下:
//定义一个对象并设置属性
const person={
name:'小明',
say:function(){
console.log('说话啦')
}
}
//在原型链中添加一个属性
person.__proto__.age=20;
//在原型链中添加一个方法
person.prototype={
run:function(){
console.log('跑步啦');
}
}
//打印是否存在name属性
console.log("name:"+person.hasOwnProperty("name"));
//打印是否存在say属性
console.log("say:"+person.hasOwnProperty("say"));
//打印是否存在age属性
console.log("age:"+person.hasOwnProperty("age"));
//打印是否存在run属性
console.log("run:"+person.hasOwnProperty("run"));
结果:自能检测出自定义的属性和方法,不能检测出原型链中的属性和方法
二、对象的密封、冻结
1.Object.seal()密封对象
(1)概念:让一个对象密封,并返回被密封的对象。密封对象是指那些不能添加新的属性,不能删除已有的属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但是可以修改已有属性对象的值。
(2)例子:
- 添加一个新属性,修改已有属性的值,删除已有属性。
代码如下:
onst obj={
name:'John',
sex:'Lady'
}
//添加一个新属性
obj.age=30;
//修改已有属性的值
obj.name="Rose";
//删除哟有属性
delete obj.sex;
//打印obj对象
console.log(obj);
结果:可以添加一个新属性,修改已有属性的值,删除已有属性。
- 密封对象并添加一个新的属性
代码如下:
const obj={ name:'John'}
//密封
Object.seal(obj);
//添加一个新属性
obj.age=30;
console.log("obj.age:"+obj.age);
结果:密封对象后就不能添加新的属性了。
- 密封对象并修改已有属性的值
代码如下:
const obj={ name:'John'}
//密封
Object.seal(obj);
//可修改已有属性的值
obj.name='Bckus';
console.log(obj.name);
结果:密封对象之后可以修改已有属性的值。
- 密封对象并删除已有属性
代码如下:
const obj={ name:'John'};
//密封
Object.seal(obj);
//删除已有属性
delete obj.name;
//打印Obj对象
console.log(obj);
结果:密封对象之后不能删除已有的属性。
- 密封对象并修改已有属性的可枚举性、可配置性、可写性
代码如下:
const obj={ name:'John'};
//密封
Object.seal(obj);
//删除已有的配置属性
Object.defineProperty(obj,'name',{
configurable:true,
writable:true,
enumerable:true
})
结果:浏览器报错,密封对象之后不能修改已有属性的可枚举性、可配置性、可写性。
2.Object.freeze()冻结对象
(1)概念:这个方法比object.seal()更厉害,冻结对象是指那些不能添加新属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远不可改变。
(2)例子:只测试与object.seal()不同的地方,也就是不能修改已有属性的值。
- 冻结对象并修改已有属性的值
代码如下:
var obj={name:'John'}
//冻结
Object.freeze(obj)
//修改已有属性的值
obj.name='Backus';
console.log('obj.name:'+obj.name);
结果:冻结对象之后不能修改已有属性的值。