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 ...
随机推荐
- 深入理解Spring MVC(山东数漫江湖)
初始工程 使用Spring Boot和web,thymeleaf的starter来设置初始工程.xml配置如下: <parent> <groupId>org.springf ...
- HDU 1234 开门人和关门人 (模拟)
题目链接 Problem Description 每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签 到.签离记录,请根据记录找出当天开门和关门的人. Input ...
- No 'Access-Control-Allow-Origin' Ajax跨域访问解决方案
No 'Access-Control-Allow-Origin' header is present on the requested resource. 当使用ajax访问远程服务器时,请求失败,浏 ...
- Android应用程序App应用上线流程
对于很多初级开发者,可能对app应用上线不太了解,本文跟大家介绍一下怎么上线app应用.上线App并不是一件很困难的事情,App的应用功能也不需要很强大,甚至不用联网,只有简单的一两个页面的App应用 ...
- Bit banging
Bit banging Bit banging is a technique for serial communications using software instead of dedicated ...
- 一文看懂IC芯片生产流程:从设计到制造与封装
http://blog.csdn.net/yazhouren/article/details/50810114 芯片制造的过程就如同用乐高盖房子一样,先有晶圆作为地基,再层层往上叠的芯片制造流程后,就 ...
- Bzoj-2301 [HAOI2011]Problem b 容斥原理,Mobius反演,分块
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 题意:多次询问,求有多少对数满足 gcd(x,y)=k, a<=x<=b ...
- 运输层和TCP/IP协议
0. 基本要点 运输层是为相互通信的应用进程提供逻辑通信. 端口和套接字的意义 什么是无连接UDP 什么是面向连接的TCP 在不可靠的网络上实现可靠传输的工作原理,停止等待协议和ARQ协议 TCP的滑 ...
- c语言实现CRC校验和
最近在摄像头采集的数据清晰度上需要加强,则在每一帧传输的数据包后边加了CRC校验和.CRC校验和有16位的,也有32位的.至于CRC校验和算法原理,我是在百度上学习的,其实网上有很多这种资料.简单的说 ...
- wifi驱动移植
目标板:Hi3518 内核版本:linux3.0.8 1.修改makefile #PLATFORM = PC //注释掉 PLATFORM = HI3518 //支持平台 ifeq ($(PLAT ...