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

备注:如果通过var obj = {} obj.age = 18这种方式设置的属性,他的可见性,可配置性,可枚举性等都为true,相当于默认设置了本篇讨论的各种属性都为true

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

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

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

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

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

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

备注:如果是不可配置,可以把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: b

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, 赋值不起作用。

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 注意这里,和我的硬编码相同的

Js中的Object.defineProperty的更多相关文章

  1. js中的Object.defineProperty()和defineProperties()详解

    ECMAS-262第5版在定义只有内部采用的特性时,提供了描述了属性特征的几种属性.ECMAScript对象中目前存在的属性描述符主要有两种,数据描述符(数据属性)和存取描述符(访问器属性),数据描述 ...

  2. js中对Object对象的一些常用操作总结

    前言我前面的文章,写过js中“类”与继承的一些文章.ES5我们可以通过 构造函数 或者 Object.create()等方式来模拟出js中的“类”,当然,对象呢是类的实例化,我们可以通过如下方式创建对 ...

  3. js中的Object.assign接受两个函数为参数的时候会发生什么?

    缘由 今天看到一段代码 return Object.assign(func1, func2); 心生疑惑,为什么 Object.assign 的参数可以是函数? 于是有了下面这一堆东西,其实都是老生常 ...

  4. js数据劫持 Object.defineProperty() 作用

    原生js Object.defineProperty() 作用 假设我们有一个obj对象,我们要给他设置一个name属性会这么做 Object.defineProperty()也可以设置对象属性 这个 ...

  5. js 中调用 Object.prototype.toString()来检测对象的类型

    1.使用toString()方法来检测对象类型 可以通过toString() 来获取每个对象的类型.为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Fun ...

  6. js中通过Object.prototype.toString方法----精确判断对象的类型

    判断是否为函数 function isFunction(it) {        return Object.prototype.toString.call(it) === '[object Func ...

  7. js中的Object.seal()与Object.freeze()

    关键字:seal, freeze, property descriptor. 1.Object.seal() 参考文档(2)中这样描述: The Object.seal() method seals ...

  8. js中的object类型

    特点: 每个Object类型的实例共有的属性和方法: constructor: 保存着用于创建当前对象的函数. hasOwnProperty:用于检测给定的属性在当前对象的实例中是否存在. isPro ...

  9. js中,object可以调用style对象,[]不可以调用style对象

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" Content=&q ...

随机推荐

  1. 初步了解更新锁(U)与排它锁(X)

     一直没有认真了解UPDATE操作的锁.近期在MSDN论坛上看到一个问题,询问堆表更新的死锁问题,问题非常easy,有相似这种表及数据: CREATE TABLE dbo.tb( c1 int, ...

  2. Oracle 为表空间增加数据文件

    dba权限检查下 select tablespace_name, file_id, file_name, ),) total_space from dba_data_files order by ta ...

  3. js 正则表达式 取反

    http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp 以匹配中文为例 const test_value = '李钊鸿' if (/[^\u4e00 ...

  4. 详解zabbix安装部署(Server端篇) (转)

    Linux下常用的系统监控软件有Nagios.Cacti.Zabbix.Monit等,这些开源的软件,可以帮助我们更好的管理机器,在第一时间内发现,并警告系统维护人员. 今天开始研究下Zabbix,使 ...

  5. PHP利用GD库绘图和生成验证码图片

    首先得确定php.ini设置有没有打开GD扩展功能,測试例如以下 print_r(gd_info()); 假设有打印出内容例如以下,则说明GD功能有打开: Array ( [GD Version] = ...

  6. Sphinx之配置文件

    # # Sphinx configuration file sample # # WARNING! While this sample file mentions all available opti ...

  7. 千万级的大表!MySQL这样优化更好

    对于一个千万级的大表,现在可能更多的是亿级数据量,很多人第一反应是各种切分,可结果总是事半功倍,或许正是我们优化顺序的不正确.下面我们来谈谈怎样的优化顺序可以让效果更好. MySQL数据库一般都是按照 ...

  8. SpringMvc 面向切面1

    1.配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC &q ...

  9. notepad 替换行收尾字符串或在行首尾新增字符

    用 Notepad++ 打开,把每一个将要放在表中单元格的内容放一行(注: ^ 代表行首 $ 代表行尾) 去除行尾空格和空白行:按CTRL+H 选择正则表达式-- 查找目标:\s+$ 替换为空 去除行 ...

  10. oracle中避免sort操作

    1.升序排列 create index ix_table1 on table1 (column1,column2); select column1,column2 from table1 order ...