通常,定义或者修改一个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()

最新文章

  1. jQuery学习之路(7)- 用原生JavaScript实现jQuery的某些简单功能
  2. 第二轮冲刺-Runner站立会议07
  3. Js控制显示、隐藏文本框中的密码
  4. hdu 4283 You Are the One 区间dp
  5. 【Animation】 使用handler和Runnable实现某一个控件的抖动效果
  6. 水面波浪形View--第三方开源--WaveView(电量、能量、容量指示)
  7. Vim 配置 winmanager
  8. 记录一次Jmeter性能测试
  9. eclipse设置项目发布到tomcat webaap下
  10. linux svn用法
  11. unity节目素材ProceduralMaterial采用
  12. Android OpenGL ES(九)绘制线段Line Segment .
  13. HDU - 3853
  14. 51Nod 1196 字符串的数量
  15. rocketMQ安装中遇到的坑
  16. PHP数字金额转换大写金额
  17. Spring @EventListener 异步中使用condition的问题
  18. 第六章 键盘(SYSMETS4)
  19. ES6的十大新特性(转)
  20. MVP 模式简单易懂的介绍方式

热门文章

  1. Python 练习题:用索引取出LIST中的值
  2. 制作一个SSRS的ORACLE数据库报表,使用了时间类型的参数。
  3. C++ explicit 的用法,就是必须显示调用
  4. 关于spring中请求返回值的json序列化/反序列化问题
  5. 2019-09-16 http 和 https的区别
  6. vue-cli vue脚手架搭建步骤
  7. android studio学习----添加项目库
  8. 基于RGB与HSI颜色模型的图像提取法
  9. AMQP与RabbitMQ
  10. pymysql 增删改 查 索引