javascript-object对象属性操作之Object.defineProperty
一、基本用法简介
声明一个简单的对象,如下
var obj = {
name: 'ldld'
}
我们可以用Object.defineProperty来声明这个对象
var obj = {}
Object.defineProperty(obj,'name',{
value:'ldld',
writable:true,
enumerable: true,
configurable: true
})
下列就这四个基本的配置简单介绍一下
- value:初始值
- writable:是否可以修改该属性的值
var obj = {}
Object.defineProperty(obj,'name',{
value:'ldld',
writable:false,
enumerable: true,
configurable: true
}) obj.name // 'ldld'
obj.name = 'LLLL'; // 这里会修改失败,严格模式下会报错 TypeError
console.log(obj.name) // 'ldld' - enumerable:是否可枚举,这个是否能遍历到该属性(for)
- configurable : 这个得重点讲一下
var obj = {}
// 第一次设置操作configurable配置,设置为false
Object.defineProperty(obj,'name',{
value:'ldld',
writable:true,
enumerable: true,
configurable: false
}) obj.name // 'ldld'
obj.name = 'LLLL'; // configurable: false 不影响writable属性,这里可以设置成功
console.log(obj.name) // 'LLLL' // 第二次设置操作configurable配置,在第一步false基础上改回true
Object.defineProperty(obj,'name',{
value:'ldld',
writable:true,
enumerable: true,
configurable: true // 现在我们想改回来,但是很遗憾,不能。不管是严格模式还是非严格模式都会报错
})此外,configurable会影响该对象属性是否可以被删除
Object.defineProperty(obj,'name',{
value:'ldld',
writable:true,
enumerable: true,
configurable: true
}) delete obj.name;
console.log(obj.name) // undefined ,说明删除成功 Object.defineProperty(obj,'name',{
value:'ldld',
writable:true,
enumerable: true,
configurable: false
}) delete obj.name;
console.log(obj.name) // ldld, 说明name属性没有被删除
二、对象常量
const str = 'abc';
str = 'def'; // 报错Uncaught TypeError: Assignment to constant variable. const obj = {name:'ldld'};
obj.name = {
name:'ldld1234' // 这里会修改成功
}
const声明的对象不可变,实际上是可以理解为指针的不可变。
const str = 'abc'; 表示str指针指向栈中一个地址,值'abc';
str = 'def';表示str又指到另一个地址,值为'def',违反了不可变的规则,报错了。
const obj = {name:'ldld'};表示obj 对象指向一个堆 内存堆的obj的引用,不管怎么改变obj里面的值,在内存堆中地方始终不变,因此不会报错。
那么问题来了,我们想声明一个不可变的对象,那怎么办?可以参考如下:
var obj = {}
Object.defineProperty(obj,'name',{
value:'ldld',
writable:false,
configurable: false
})
// 此时问obj的name属性不可改变了。
但是问题来来,name是不能再改变,但是我们可以给对象扩展其他属性。。。
三、防止对象扩展Object.preventExtensions
var obj = {}
Object.defineProperty(obj,'name',{
value:'ldld',
writable:false,
configurable: false
})
// 此时问obj的name属性不可改变了。但是可以扩展obj属性
obj.age = 100;
console.log(obj.age) // 100
Object.preventExtensions(obj);
obj.sex = 'male';
console.log(obj.sex) // undefined,说明扩展失败
四、密封Object.seal
顾名思义,密封一个对象,这个对象不能配置,不能扩展属性,不能删除属性。但是可以可以修改熟悉过的值
Object.seal(obj)// 等同于如下:代码1 + 代码2
// 代码1
Object.defineProperty(obj,'[该对象所有的属性]',{
configurable: false
// writable:true, // 此时默认为true,可以修改
})
// 代码2
Object.preventExtensions(obj);
四、冻结Object.freeze(obj)
Object.freeze(obj)// 等同于如下:代码1 + 代码2
// 代码1
Object.seal(obj)
// 代码2
Object.defineProperty(obj,'[该对象所有的属性]',{
writable:false
})
由此可见,冻结,就是定一个对象常量的终极大法。
javascript-object对象属性操作之Object.defineProperty的更多相关文章
- JavaScript 之 对象属性的特性 和defineProperty方法
对象是无序属性的集合,而这些属性在创建是都带有一些特征值(可以理解为属性的属性,天生自带的),这些特征值是为了实现JavaScript引擎用的,因此JavaScript不能直接访问. JavaScri ...
- js object 对象 属性和方法的使用
//object 对象 属性和方法的使用 var person = new Object(); person.name="张海"; person.age="; perso ...
- JavaScript 访问对象属性和方法及区别
这篇文章主要介绍了浅析JavaScript访问对象属性和方法及区别的相关资料,仅供参考 属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸. ...
- 转: JavaScript 获取对象属性和方法
一.获取对象属性和方法 Object.keys()for in 返回对象的可枚举属性和方法的名称数组. Object.getOwnPropertyNames() 返回的数组的所有属性(可枚举或不可枚举 ...
- JavaScript 获取对象属性和方法
ShineJaie 原创整理,转载请注明出处. 一.获取对象属性和方法 Object.keys() 返回对象的可枚举属性和方法的名称数组. Object.getOwnPropertyNames() 返 ...
- 2018-06-27 jq文档处理与jq对象属性操作
jQ文档处理: 内部插入 A.append(B) ->把B后追加到A内部中 B.appendTo(A) ->把B后追加到A内部中 A.prepend(B) ->把B后追加到A内部中 ...
- js 中object对象的操作
n = object对象 for(var p in n){ console.log(p);// 取得是key值 console.log(n[p]);//取得是value值 } 继之前js中数组的常用方 ...
- js - object的属性操作
视频学习地址: http://www.imooc.com/video/6002 原文PPT下载地址: http://img.mukewang.com/down/54c5ec1a000141f10000 ...
- 获取Object对象属性的方法,Reflect.ownKeys, Object.getOwnPropertyNames,Object.getOwnPropertySymbols,Object.keys,for in
let triangle={ a:1, b:2, c:3 } function coloTriangle(){ this.color='red'; } coloTriangle.prototype=t ...
随机推荐
- c编程过程中错误笔记-& 理解不深啊!
写了一个函数,删除数组里面的元素,声明如: int student_delete(int *len, struct student stu[]): 在其内部调用了另一个函数 int student_d ...
- MySQL练习与小结
当你专注一件事的时候,时间总是过得很快! foreign key 练习 -- 切换数据库 use stumgr -- 删除班级表 drop table t_class1 -- 创建一个班级表 crea ...
- h2内嵌数据库使用
参考文档 1 https://www.cnblogs.com/xdp-gacl/p/4171024.html 参考文档 2 https://blog.csdn.net/mafan121/article ...
- [Python3] 008 列表内涵,“满腹经纶”
目录 简述 少废话,上例子 例1 用 for 创建列表 例2 看看乘法"向"着谁 例3 给列表加一张"滤纸" 例4 列表生成式可以嵌套 例5 列表生式还能嵌入条 ...
- [Python3 填坑] 012 字典的遍历在 Python2 与 Python3 中区别
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python2 中字典的遍历 2.2 Python3 中字典的遍历 2.3 结论 1. print( 坑的信息 ) 挖坑时间:2019/ ...
- ML5238电池管理芯片笔记
根据公司需要开发了以ML5238电池管理芯片+STM8S为核心的电池管理系统.由于前期对BMS系统还是了解甚少,开发起来也遇到了不少困难.再开发管理系统的同时,我也开发了管理系统的上位机, ...
- 问题 G: 圆桌上的晚餐
问题 G: 圆桌上的晚餐 时间限制: 1 Sec 内存限制: 128 MB提交: 1583 解决: 656[提交] [状态] [命题人:jsu_admin] 题目描述 大家一定在圆 ...
- js的事件流理解
面试问到js的事件流,当时说的不是很清楚,现在觉得有必要把这个弄清楚. 事件捕获和事件冒泡 事件流描述的是从页面中接收事件的顺序,也可理解为事件在页面中传播的顺序. 事件流主要分为两种,即事件捕获和事 ...
- JavaScript基础3——使用Button提交表单
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 关于JSON使用要注意的地方
1.json 1.JSON对象;(ES5) 1)JSON.stringify() json---js[json字符串--->JavaScript对象] 2 ...