ES5 Object.defineProperty 方法
先看一个例子:
var o = {};
o.a = 1;
// 等待于:
Object.defineProperty(o, 'a', {
value: 1,
writable: true,
configurable: true,
enumerable: true
});
Object.defineProperty(o, 'a', { value: 1 });
// 等待于:
Object.defineProperty(o, 'a', {
value: 1,
writable: false,
configurable: false,
enumerable: false
});
下面详细描述这些参数的意义:
configurable
false(默认)
true
1) 对象的描述可以修改或者增加, 描述包括 configurable enumerable set get value
2) obj.b 是可以删除的, delete(obj.b);
下面的例子设置为 false 以后, 再设置 上面的那些属性都会报错。
var o = {}
Object.defineProperty(o, 'b', {
configurable: false
});
Object.defineProperty(o, 'b', {
configurable: true
}); // thrown error
Object.defineProperty(o, 'b', {
enumerable: false
}); // thrown error
enumerable
false(默认)
true, 代表是可以枚举的
value
undefined(默认)
obj 的属性的值
writable
false(默认)
true, 代表这个值可以修改, 修改值不受 configurable 影响
var o = {}
Object.defineProperty(o, 'b', {
configurable: false,
value: 2,
writable: true
});
o.value = 3333; // 3333
set 和 get 方法
对象取值会调用get方法, 取得的值为 get 函数里的返回值
对象赋值会调用set方法, 但是若赋值是用 Object.defineProperty 则不会调用set方法
例:
var o = {}
Object.defineProperty(o, 'b', {
configurable: true,
get: () => { console.log('get'); return 1},
set: (para) => { console.log('set' + para); }
});
o.b; // 输出'get'; 值为1
o.b = 2; // 输出'set2'; 值为2 // 下面的赋值 不会调用 set 方法
Object.defineProperty(o, 'b', {
value: 22222
}); // o.b = 22222 // 注意下面的写法则会报错
Object.defineProperty(obj, 'b', {
value: 1,
get: function() { return 1; }
}); Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute
不能同时设置 存取器(get 和 set方法) 和 (value 或 writable) 属性, 就算 writable 属性设置为 true 也不行
参考地址:
ES5 Object.defineProperty 方法的更多相关文章
- js中Object.defineProperty()方法的解释
菜菜: “老大,那个, Object.defineProperty 是什么鬼?” 假设我们有个对象 user ; 我们要给它增加一个属性 name , 我们会这么做 1 2 3 var user = ...
- 20+行代码使用es5 Object.defineProperty 实现简单的watch功能
/** * 一个简单的demo 帮助理解defineProperty,只对Object类型参数有效 */ $watch=function(myObject,callback){ function in ...
- Object.defineProperties()和Object.defineProperty()方法
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 语法:Object.defineProperty(obj, pro ...
- Object.defineProperty方法 使用
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 语法: Object.defineProperty(obj, pr ...
- Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, ...
- JavaScript Object.defineProperty()方法详解
Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法 Object.defineProperty(obj, prop ...
- Vue el与data的两种写法 && Object.defineProperty方法
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...
- Object.defineProperty方法
Object.defineProperty() (一次添加/修改一个属性) 用法:Object.defineProperty(obj, prop, descriptor) 方法会直接在一个对象上定义一 ...
- JavaScript使用Object.defineProperty方法实现双数据绑定
Object.defineProperty这个方法非常值得学习,很多mvc框架中的双向数据绑定就是通过它来实现的. 本着互联网分享精神,今天我就将我自己的见解分享给大家,希望能有所帮助. 开始使用 O ...
随机推荐
- JS之window对象
window对象 window属性: opener:打开当前窗口的源窗口,如果这个窗口是由别的网页点击链接跳转过来的,或者是从另外一个页面点击打开窗口打开的,opener就是找到源页面的.如果当前窗口 ...
- 继承自UITableView的类自带tableView属性,不需要在创建该属性,因为父类UITableView已经创建.
继承自UITableView的类自带tableView属性,不需要在创建该属性,因为父类UITableView已经创建. https://www.evernote.com/shard/s227 ...
- HH实习 acm算法部 1689
题目描述 这学期到了十五周了,HH突然要去实训中心实习了,想到要拿着钳子,锯子什么的,头就有点大了,因为它挺好玩的,但是,也是很累的,看着学弟坐在机房悠闲地敲着代码,HH学长决定要让他们好好忙忙,这道 ...
- 爬虫--requests讲解
什么是requests? Requests是用Python语言编写,基于urllib,采用Apache2 Licensed 开源协议的HTTP库.它比urllib更加方便,可以节约我们大量的工作,完全 ...
- HDU 2899 三分
我们对这个函数求二阶导数,发现他的二阶导数是恒大于0的,那么他的导数是单调的,且在某时刻为0,那么这时的x值就是极值处的x值,其实题目说了,有最小值,那么我们三分水过去就好了. 反思:精度不够,因为是 ...
- Python 对象模型 -- (转)
面向对象的纯粹性 在很久很久以前,C++还被称为面向对象语言(现在一般称为多范式通用语言),人们就对C++的面向对象的纯粹性提出了质疑,主要有以下几点: 并非所有的对象都是对象(很拗口?),比如指针本 ...
- Eureka Server的高可用
Eureka Server进行互相注册的方式来实现高可用的部署,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署 创建application-peer1. ...
- 非 GUI 模式运行 JMeter 压力测试
非 GUI 模式,即命令行模式,运行 JMeter 测试脚本能够大大缩减所需要的系统资源. 使用命令:jmeter -n -t <testplan filename> -l <lis ...
- 离线安装SDK
1.下载android-sdk_rXX-windows.zip(XX为版本号,也可以下.exe版的不过没试过) 2.下载SDK 2.1.在浏览器输入http://dl-ssl.google.com/a ...
- clearcase command (windows 常用的几个)
command 1. setview 指定某个view你可以操作,否则你将看不到文件,ls,cd 等其它命令无效 setview viewname 2. rename branch type na ...