js学习日记-对象字面量

对象字面量语法

var person={
    name:'小王',
    age:18,
    _pri:233
} 

1.采用对象字面量方法创建的对象,不能采用var wang=new person()这样的方式来调用,要访问对象中的方法,直接使用person.xxx的形式

2.最后一个成员结尾不要用逗号,不然在某些浏览器中会抛出错误

3.成员名相同会发生什么?

es5普通模式下后定义的会覆盖前面定义的,严格模式则会报错

es6则不管什么模式都采用后面的覆盖前面的

4.成员名可以是动态变量吗?

es5只能在对象字面量表达式申明以后再添加

     var dynamicVar="dyna";
     var person={
     }
     person[dynamicVar]='123';
     console.log(person[dynamicVar])

 es6则更符合使用场景,可在表达式内创建动态的成员名

     var dynamicVar="dyna";
     var person={
       [dynamicVar]:'test'
     }
     console.log(person[dynamicVar])

对象成员配置

对象申明后,会默认为内部的每个成员(属性或方法)生成一些隐藏属性,这些隐藏属性是可以读取和可配置的:

Object.getOwnPropertyDescriptor()或getOwnPropertyDescriptor()-读取成员的隐藏属性

Object.definePropertype或Object.defineProperties----设置成员的隐藏属性

相应的隐藏信息如下:

configurable-是否可以删除某个成员,默认为true,需要注意的是,如果该属性如果定义为false,后续又定义为true的话会报错

     Object.defineProperty(person,'name',{
       configurable:false
     })
     Object.defineProperty(person,'name',{
      configurable:true
     })
writable-成员是否可写,默认为true
     Object.defineProperty(person,'name',{
       writable:false
     })
     person.name='小李'; //属性不可写,严格模式下会报错
     console.log(person.name); //输出小王,说明上面一句无效

enumerable-成员是否可被枚举,默认为true,该属性主要是用来防范Object.keys()和for in的,也就是说该属性设置对于Object.getOwnPropertyNames()方法是无效的

get与set-读写成员时调用的函数,默认为undefined

在最开始处的对象定义中,我们创建了一个_pri成员,表示这个成员应在内部读取,下划线只是一个标记符,并不能限制该成员只能在对象内部访问。接下来我们来封装一个属性读写器对_pri成员进行读取,读写器名称随意取,这里叫pri只是为了可读性

     Object.defineProperty(person,'pri',{
       get:function(){
         //做一些其它操作
         console.log('准备获取_pri的值')
         return _pri;
       },
       set:function(newValue){
         _pri =newValue
       }
     })
     person.pri='456';
     console.log(person.pri);
如果只有get则表示属性值是只读的,只有set表示只能写。
属性读写器最常用的场景就是在读取或写入属性前可以附带的做一些操作,达到更好的封装性

高级特性

1.我想要继承一个对象字面量对象,该怎么办?

Object.create(person)可产生一个具有继承特性的新对象,但是需要注意的是,父类的引用成员是和子类共享的,当子类修改引用成员时,父类的该成员也会同步发生变化

     var person={
       name:'小王',
       age:18,
       _pri:233,
       gf:['豆得儿','张G','TFb']
     }
     var child=Object.create(person); 
     child.gf.splice(0,1); //跟豆得儿分手了
     console.log(person.gf.length) //父类的gf也变成2了,父子共享女友,尼玛,太乱了

  看到了吗,所以使用此种继承法时一定要小心,能不用最好不用

2.我不想让别人在我的对象上添加成员该怎么办?

Object.preventExtensions(),该方法用于阻止向对象添加成员,使用Object.isExtensible()判断对象是否可添加成员

    Object.preventExtensions(person);
    //添加成员无效,非严格模式下什么都不会发生,严格模式下会报错
    person.bankAccount='中国农业银行'
    //依然可以删除成员,证明了preventExtensions方法只能阻止添加方法
    delete person.age;
    console.log(person.age) //undefined,表明删除成功了

3.我不想让别人添加、删除成员

Object.seal()用来阻止添加或删除成员,判断对象是否是密封的可采用Object.isSealed()

4.我不想让别人添加、删除成员,也不想让别人对里面的成员进行赋值操作

使用Object.freeze()方法后,person.age="xxx" 这种赋值就无效了,但是写入属性(上面set定义的)依然是有效的

猜你喜欢

转载自www.cnblogs.com/94pm/p/9179231.html