通过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. Solr 配置文件之schema.xml

    schema.xml这个配置文件的根本目的是为了通过配置告诉Solr怎样建立索引. solr的数据结构例如以下: document:一个文档.一条记录 field:域.属性 solr通过搜索某个或某些 ...

  2. jdk/java版本与Android源码编译中的错误

    错误一:javap未指向有效的java版本 Traceback (most recent call last): File "../../base/android/jni_generator ...

  3. mysql double 乘法 缺失精度

    CREATE TABLE tmp_decimal( id BIGINT auto_increment PRIMARY KEY , amount DOUBLE ); 创建测试表 插入测试数据 INSER ...

  4. PS 文字有锯齿怎么办

    1 可以在矢量绘图软件里面做,就没有锯齿了,画好之后导入到PS即可. 2 可以把PSD文件的像素值变大一些,比如调成500像素/英寸,但是这样会导致做出来的东西体积比较大,所以最好还是学会矢量绘图.

  5. php正则表达式基本

    一.正则表达式的组成 1.分隔符,可以是除了字母,数字,反斜线及空白以外的任何字符,比如/,!,#,%,|,~等;通常有/,!,~ 2.表达式:由一些特殊字符和非特殊字符组成. 3.修饰符:用于开启或 ...

  6. html:HTML元素分类

    参考博客:http://www.cnblogs.com/polk6/p/3185692.html#Menu3-Display HTML元素大题可分为内联(inline)元素和块(block)元素. 1 ...

  7. 无法调试存储过程,无法启动T-SQL调试

    用本机管理员或者具有SYSADMIN角色的帐号登录,不要用.,用实例名来连接

  8. int byte转换

    //命令码0x8001转为int为32769,发送时反序 ] { 0x01, 0x80 }; ); //int to byte[] ; byte[] b = BitConverter.GetBytes ...

  9. 关于TCP/IP,这十个问题你都知道,就入门了!

    关于TCP/IP,必知必会的十个问题 本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养.   TCP/IP十个问题 一.TCP/IP模型 TCP/IP ...

  10. Android中常用布局单位

    Android在UI布局时经常用到一些单位,对单位混用直接会影响UI的显示,要想正确的在布局中使用每种单位就必须先真正的熟悉它. UI显示效果的影响因素:屏幕尺寸.屏幕密度.分辨率:而android手 ...