Const扩展

一、Object.defineProperty()函数和Object.hasOwnProperty()函数

  1. 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);

结果:冻结对象之后不能修改已有属性的值。

你可能感兴趣的:(es6)