通常,定义或者修改一个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. C#工具类OracleHelper,基于Oracle.ManagedDataAccess.Client封装

    基于Oracle.ManagedDataAccess.Client封装的Oracle工具类OracleHelper,代码如下: using System; using System.Data; usi ...

  2. delphi实现窗体闪烁功能

    delphi实现窗体闪烁功能 以前做窗口闪动时都没有考虑到让任务栏上的按钮闪动的问题, 现在一个客户需要任务栏按钮闪动,发现以前使用的flashwindow不能达到要求了, 查找了一下,找到flash ...

  3. css层叠规则(层叠样式表)

    CSS层叠规则: 1.找出所有相关的规则,这些规则都包含与一个给定元素匹配的选择器. 2.按权重(!important)和来源对应用到给定元素的所有声明进行排序. 3.按特殊性对应用到给定元素的所有声 ...

  4. YUM方式安装MYSQL5.7

    首先mysql官网下载yum源https://dev.mysql.com/downloads/repo/yum/ 然后将下载好的rpm文件安装并校验 [root@elegant-snap-3 /sta ...

  5. python循环删除列表元素留一个问题

    https://www.cnblogs.com/baihualin/p/10698651.html 引用up

  6. CMake相关代码片段

    目录 用于执行CMake的.bat脚本 CMakeLists.txt和.cmake中的代码片段 判断平台:32位还是64位? 判断Visual Studio版本 判断操作系统 判断是Debug还是Re ...

  7. 05、ip划分+网络配置+虚拟化基础+基本路由

    -- IP   IANA (Internet Assigned Numbers Authority) ,Internet号分配机构.负责对IP地 址分配规划以及对TCP/UDP公共服务的端口定义.国际 ...

  8. 记一次wsl上的pip3安装失败问题 The following packages were automatically installed and are no longer required:

    转载请注明来源.https://www.cnblogs.com/sogeisetsu/.然后我的CSDNhttps://blog.csdn.net/suyues/article/details/103 ...

  9. matplotlib---画等高线

    contour - 绘制等高线 mp.contour(x, y, z, 等高线条数,colors=颜色, linewidth=线宽)#等高线绘制 contourf - 填充等高线 mp.contour ...

  10. el-table 固定表头

    fixedTableHeaderMixin.js: /* 使用此mixin: 第一:需要在页面的el-table配置属性:ref="table" 和 :height="t ...