Js中的Object.defineProperty

经过Object.defineProperty为对象设置属性,并同时规定属性的属性(可见性,可配置性,可枚举性等)函数

备注:若是经过var obj = {} obj.age = 18这种方式设置的属性,他的可见性,可配置性,可枚举性等都为true,至关于默认设置了本篇讨论的各类属性都为true编码

 

语法:Object.defineProperty(obj, prop, descriptor)对象

第一个参数:目标对象
第二个参数:须要定义的属性或方法的名字。
第三个参数:目标属性所拥有的特性。(descriptor)ip

descriptor:取值
  value:属性的值
  writable:若是为false,属性的值就不能被重写,只能为只读了
  configurable:总开关,一旦为false,就不能再设置他的(value,writable,configurable)
  enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。
  get:设置方法
  set:获取方法get

备注:Object.getOwnPropertyDescriptor(obj,"name")查看obj对象name属性的属性it

descriptor默认值
  var a= {}
  Object.defineProperty(a,"b",{
    value:123
  })
  console.log(a.b);//123
只设置了value别的并无设置,它会默认把writable,configurable,enumerable都设置为falseio

 

configurable  总开关,第一次设置 false 以后,第二次什么设置也不行了console

备注:若是是不可配置,能够把writable由true改成false但不能从false改成true
  var a= {}
  Object.defineProperty(a,"b",{
    configurable:false
  })
  Object.defineProperty(a,"b",{
    configurable:true
  })
  //error: Uncaught TypeError: Cannot redefine property: btable

 


writable  若是设置为fasle,就变成只读了。。
  var a = {};
  Object.defineProperty(a, "b", {
    value : 123,
    writable : false
  });
  console.log(a.b);  // 打印 37
  a.b = 25;     // 没有错误抛出(在严格模式下会抛出)
  console.log(a.b);  // 打印 37, 赋值不起做用。function

 

 

enumerable  定义了对象的属性是否能够在 for...in 循环和 Object.keys() 中被枚举。
  var a= {}
  Object.defineProperty(a,"b",{
    value:3445,
    enumerable:true
  })
  console.log(Object.keys(a));  // 打印["b"]
  改成false
  var a= {}
  Object.defineProperty(a,"b",{
    value:3445,
    enumerable:false
  })
  console.log(Object.keys(a));// 打印[]


set和get  赋值 或者 取值的时候会分别触发 set 和 get 对应的函数
注:1.不能同时设置get和set与wriable或value,就是说想用get和set,就不能用wriable或value中的任何一个

  2.经过obj={} 这种形式去定义get/set方法的时候,和这里不太同样

    a.get/set和函数之间不须要冒号,例如obj={get name(){return "xiaol"}}  var a= {}  Object.defineProperty(a,"b",{     set:function(newValue){       console.log("你要赋值给我,个人新值是"+newValue)     },     get:function(){       console.log("你取个人值")       return 2   //注意这里,我硬编码返回2     }  })  a.b =1   //打印 你要赋值给我,个人新值是1  console.log(a.b) //打印 你取个人值            //打印 2 注意这里,和个人硬编码相同的

相关文章
相关标签/搜索