自己封装一个Object.freeze()方法
1、遍历所有属性和方法
2、修改遍历到的属性的描述
3、Object.seal()
Object.defineProperty(Object,'freezePolyfill',{
value:function(obj){
var i;
//遍历属性和方法
for(i in obj){
if(obj.hasOwnProperty(i)){
Object.defineProperty(obj,i,{
//修改遍历到的属性
writable:false
});
}
}
Object.seal(obj);
}
});
如果对象的其中一个属性又是对象,那么这个对象中的对象里的属性是可以被修改的。可以使用递归判断外层对象的属性是否为对象,再重新使用freezePolyfill()方法去套。(不使用递归而使用迭代的方式也可以):
Object.defineProperty(Object,'freezePolyfill',{
value:function(obj){
var i;
for(i in obj){
if(obj.hasOwnProperty(i)){
//判断属性是否为对象
if(typeof(obj[i]) === 'object'){
//迭代freezePolyfill方法
Object.freezePolyfill(obj[i]);
}else{
Object.defineProperty(obj,i,{
writable:false
});
}
}
}
Object.seal(obj);
}
});
应用:
const xiaoming = {
age:14,
name:'小明',
obj:{
a:1
}
};
Object.freezePolyfill(xiaoming);
总结:
Object.defineProperty(obj,name,value)这个方法可以往一个对象上添加一个属性。第一个参数为对象名,第二个参数为属性名,第三个参数为属性值及描述。
Object.seal(变量名)方法可以阻止对象被扩展,但是无法阻止对象被修改。可以使用defineProperty()将对象属性设置为只读。
上述两个方法结合起来可以简单的达到一个Ojbect.freeze()的效果。
语法
Object.defineProperty(obj, prop, descriptor)
参数
obj
- 要在其上定义属性的对象。
prop
- 要定义或修改的属性的名称。
descriptor
- 将被定义或修改的属性描述符。
自己封装一个Object.freeze()方法的更多相关文章
- Object.freeze(); 方法冻结一个对象。
Object.freeze() 方法可以冻结一个对象.一个被冻结的对象再也不能被修改: 冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性.可配置性.可写性 ...
- 怎样手写一个Object.create()方法
Object.create()会将参数对象作为一个新创建的空对象的原型, 并返回这个空对象, 基于这个功能, 就有了下面这个Object.create()的手动实现: function _create ...
- js es6 Object.freeze
将对象冻结,使用Object.freeze方法 const foo = Object.freeze({}); // 常规模式时,下面一行不起作用: // 严格模式时,该行会报错 foo.prop = ...
- Object.freeze
Object.freeze() 方法可以冻结一个对象.一个被冻结的对象再也不能被修改:冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性.可配置性.可写性, ...
- ES6 之 Object 的方法总结
阅读:Object 1.obj的"." 或 "[]"方法 读取对象的属性或方法 对象属性的读取:ES6中被Proxy的get(target, propKey, ...
- 我被冻在了 vue2 源码工具函数第一行Object.freeze()(一)
前言 最近参加若川的源码共度活动,第 24 期 vue2 源码工具函数,最开始: var emptyObject = Object.freeze({}); 之前知道 Object.freeze() 是 ...
- ES5特性之Object.freeze
Object.freeze方法比Object.seal方法更严格,不仅不能扩展新对象和不可重新配置属性的特性,还不能改变对象属性的值writable(不可写)
- 在ES5实现ES6中的Object.is方法
ES6中对象的扩展里面添加了一个Object.is方法,用于比较两个值是否严格相等.内部计算与 === 行为基本一致.那么我们怎么在不支持这个方法的ES5中实现呢? 首先我们需要搞清楚两点,1:Obj ...
- Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, ...
随机推荐
- 前端基础EL表达式(八)
一.什么是EL表达式? 1.什么是EL表达式? EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言, ...
- RegisterClass/RegisterClassEx -- 注册窗口类
(1)函数原型 1 //RegisterClass 2 ATOM RegisterClass( 3 const WNDCLASS * lpWndClass //Long pointer to a WN ...
- JS_点击事件_弹出窗口_自动消失
<!doctype html> <html> <head> <meta charset="utf-8"/> <title> ...
- 大数据学习(24)—— Spark入门
在学Spark之前,我们再回顾一下MapReduce的知识,这对我们理解Spark大有裨益. 在大数据的技术分层中,Spark和MapReduce同为计算层的批处理技术,但是Spark比MapRedu ...
- selenium元素定位之 动态id, class元素定位
1.直接进入正题 如下图, 有些元素每次进入都会刷新, 造成元素无法重复定位 怎么办? "xpath部分属性值"定位方法可以帮到我们 1.包含属性定位 driver.find_el ...
- C++面向对象总结——虚指针与虚函数表
最近在逛B站的时候发现有候捷老师的课程,如获至宝.因此,跟随他的讲解又复习了一遍关于C++的内容,收获也非常的大,对于某些模糊的概念及遗忘的内容又有了更深的认识. 以下内容是关于虚函数表.虚函数指针, ...
- 对抗防御之对抗样本检测(一):Feature Squeezing
引言 在之前的文章中,我们介绍了对抗样本和对抗攻击的方法.在该系列文章中,我们介绍一种对抗样本防御的策略--对抗样本检测,可以通过检测对抗样本来强化DNN模型.本篇文章论述其中一种方法:feature ...
- 学习vue过程中遇到的问题
1.vue-quill-editor动态禁用 项目中把vue-quill-editor单独封装成了一个组件,通过props传递readOnly参数来设置是否禁用editor.开发中发现可以实现禁用效果 ...
- TCP文件上传实现
TCP文件上传实现 服务端: package net.study; import java.io.*; import java.net.ServerSocket; import java.net.So ...
- 关于const声明一些东西
const int a; int const a; const int *a; int *const a; const int *const a; 前两个 ...