通常,定义或者修改一个JS对象,有以下方式:

// 1. 字面量

let obj = {
name: 'cedric',
age: 18
} // 2. new Object()
let obj = new Object()
obj.name = 'cedric'
obj.age = 18 // 3. Object.create() // 4. 工厂模式 // 5. 构造函数 // 6. ...

上面当对象创建一个属性后,如:obj.name = 'cedric', 其中 name 就是一个 【普通属性】,ta的值允许修改或删除,也可以通过for..inObject,keys 枚举遍历。

如果要更精准的控制对象属性,可以使用 Object.defineProperty() 方法。

语法

Object.defineProperty(obj, prop, descriptor)

// obj: 需要定义属性的当前对象
// prop: 当前需要定义或修改的属性名
// descriptor: 属性描述符

例如:

let obj = {}; // 创建一个新对象

// 在对象中添加一个属性与数据描述符的示例
Object.defineProperty(obj, "name", {
value : 'cedric', // 属性 value 的初始化值 cedric
writable : true, // 可修改值内容, 默认值 false
enumerable : true, // 可枚举,默认 false
configurable : true // 可枚举,默认 false
});

属性描述符 - descriptor

属性 说明 默认值
configurable 该属性为true时才可以被删除 false
enumerable 为true时,可以被for...in或Object.keys枚举 false
value 该属性对应的值 undefined
writable 为true时,value才能被赋值运算符改变 false
get 取值的时候,触发 undefined
set 修改属性的时候,触发 undefined

set 和 get

设置set或者get,就不能在设置value和wriable,否则会报错。

let obj = {
__age: 18
}; Object.defineProperty(obj, 'age', {
enumerable: true,
configurable: true,
get: function () {
console.log('get------------age');
return 'My age is ' + this.__age;
},
set: function (newVal) {
console.log('set------------age', newVal);
this.__age = newVal;
}
}); console.log(obj.__age); // 18, __age为普通属性
console.log(obj.age); // My age is 18 , 触发 get()
obj.age = 22;  // 触发 set()

console.log(obj.__age);  // 22
console.log(obj.age); // My age is 22, 触发 get()
obj.__age = 33; // 既不触发 set() , 也不触发 get()

console.log(obj.__age);  // 33
console.log(obj.age); // My age is 33 , 触发 get()

关于 Object.defineProperty()的更多相关文章

  1. javascript之Object.defineProperty的奥妙

    直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...

  2. Object.defineproperty实现数据和视图的联动

    Object.defineproperty语法 var o = {}; // 创建一个新对象 // Example of an object property added with definePro ...

  3. Vue 双向数据绑定原理分析 以及 Object.defineproperty语法

    第三方精简版实现 https://github.com/luobotang/simply-vue Object.defineProperty 学习,打开控制台分别输入以下内容调试结果 userInfo ...

  4. Object.defineProperty vs __defineGetter__ vs normal

    Testing in Chrome 31.0.1650.63 32-bit on Windows Server 2008 R2 / 7 64-bit Test Ops/sec Object.defin ...

  5. Object.defineProperty

    属性类型ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为了实现JavaScript引擎用的,因此在Ja ...

  6. Object.defineproperty实现数据和视图的联动 ------是不是就是 Angular 模型和视图的同步的实现方式???

    参考:http://www.cnblogs.com/oceanxing/p/3938443.html https://developer.mozilla.org/zh-CN/docs/Web/Java ...

  7. 20+行代码使用es5 Object.defineProperty 实现简单的watch功能

    /** * 一个简单的demo 帮助理解defineProperty,只对Object类型参数有效 */ $watch=function(myObject,callback){ function in ...

  8. Object.defineProperty()方法的用法详解

    Object.defineProperty()函数是给对象设置属性的. Object.defineProperty(object, propertyname, descriptor); 一共有三个参数 ...

  9. 理解Object.defineProperty()

    理解Object.defineProperty() Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 基本语法:Obj ...

  10. 利用object.defineProperty实现数据与视图绑定

    如今比较火的mvvm框架,例如vue就是利用es5的defineProperty来实现数据与视图绑定的,下面我来介绍一下defineProperty的用法. var people= {} Object ...

随机推荐

  1. AspNet Core使用Mysql一些问题及解决方案

    本文假设的你的AspNet Core 2.2的Web程序通过EntityFrameworkCore连接使用MSSQL数据库,能正常使用. 如何想转为使用Mysql,其实不难. 1.安装Mysql这个简 ...

  2. .Net Core实战教程(二):设置Kestrel的IP与端口的几种方法

    .Net Core实战教程(二):设置Kestrel的IP与端口的几种方法 1.直接写在代码方式 Program.cs代码如下: using System; using System.Collecti ...

  3. css+js实现自动伸缩导航栏

    用css+js实现自动伸缩导航栏 需要达到的效果: 默认首页选中样式 设置鼠标滑过效果:颜色变化(#f60),宽度变化,字体变化 所涉及的知识点: 布局:float css: 元素状态切换(displ ...

  4. Java常用框架和软件

  5. 实现HTML调用打开本地软件文件

    有时候我们想要实现一个功能,就是在HTML页面点击一个链接就能调用打开本地可执行文件.就像腾讯QQ.迅雷这种. 而实现这种功能其实也很简单,就是需要我们添加修改注册表,实现自定义URL Protoco ...

  6. helm搭建本地chart仓库及基本操作

    这个步骤,是配合公司的竞赛. 因为公司这次的环境,我们只有namespace权限,而没有整个集群的管理, 而且,公司没有提供统一的helm chart repo, 所以只能自建. 参考URL: htt ...

  7. IDEA+SpringBoot项目启动参数设置

    SpringBoot属性加载顺序 顺序 形式 1 在命令行中传入的参数 2 SPRING_APPLICATION_JSON中的属性.SPRING_APPLICATION_JSON是以JSON的格式配置 ...

  8. 201871010109-胡欢欢《面向对象程序设计(java)》第四周学习总结会

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  9. discuz开发实现自动获取后台入口代码

    一般discuz后台入口默认是admin.php,不过部分用户为了安全可能会修改后台入口文件名称,可以用代码 '.ADMINSCRIPT.'?frame=no&action=tools& ...

  10. Python学习笔记7 头文件的添加规则(转载)

    转载自:https://www.cnblogs.com/taurusfy/p/7605787.html ************************************************ ...