《前端之路》之 JavaScript 进阶技巧之高阶函数(下)
第二章 - 03: 前端 进阶技巧之高阶函数
一、防篡改对象
JavaScript共享的本质一直是开发人员心头的痛,因为任何对象都可以被在同一个环境中运行的代码修改。
ECMAScript5致力于解决这个问题,可以让开发人员定义防篡改对象(tamper-proof object)。它的原理就是
通过设置每个对象的属性的一下的默认属性:
- [[Configurable]] --- 是否可配置
- [[Writable]] --- 是否可以重新赋值
- [[Enumerable]] --- 是否可列举的
- [[Value]] --- 默认值
- [[Get]]
- [[Set]]
1-1:Configurable 和 Writable
下面我们就针对以上每一个属性进行 解析一下:
// Demo one
var o = {}
Object.defineProperty(o, 'name', {
value: 'zhang',
configurable: false
})
console.log(o)
Object.defineProperty(o, 'name', {
writable: false
})
o.name = 'Li'
console.log(o) // {name: 'zhange'} 属性未被改变
上面的 Demo 中 我们将 configurable 属性设置成为 false, 再对比下面的 Demo 来看 configurable 属性作用
// Demo two
var o = {}
Object.defineProperty(o, 'name', {
value: 'zhang',
configurable: false
})
console.log(o)
Object.defineProperty(o, 'name', {
writable: true
})
o.name = 'Li'
// Uncaught TypeError: Cannot redefine property: name 报错
总结: 当 [[Configurable]] 为 fasle 的时候 [[Writable]] 默认已经被设置 false, 如果去修改 [[Writable]] 的时候
则会报错。 那么我们就可以理解为 当 [[Configurable]] 为 false 的时候, [[Writable]] 是只能为 false的。
1-2:Enumerable
我们还是用 Demo 来进行对比解释:
var o = {}
Object.defineProperty(o, 'age', {
enumerable: true,
value: 18
})
for(item in o) {
console.log(item, o[item]) // age 18
}
把 enumerable 设置成 false
var o = {}
Object.defineProperty(o, 'age', {
enumerable: false,
value: 19
})
for(item in o) {
console.log(item, o[item]) // undefined
}
1-3:get 、set
get 和 set 这对双胞胎我们已经说过多次了。这次我们仔细来看下这个~
var o = {}
var v = 'coder'
Object.defineProperty(o, 'job', {
get: function() {
console.log('get:', v)
return v
},
set: function(newV) {
console.log('set:', newV)
v = newV
}
})
o.job = 'xxx' // set: xxx
// 很奇怪的一点就是 当我们在 浏览器控制台点开 o 对象的时候,再次去点击 job 属性,就会触发 get 方法。
2-1:不可扩展对象
Object.preventExtensions(o)
可以使得 不能再给对象添加属性和方法
var o = {name: 'zhang'}
Object.preventExtensions(o)
o.age = '12'
console.log(o) // {name: 'zhang'}
// 已经阻止了给对象添加属性和方法了。再去添加 也未能添加上
Object.isExtensible(o)
确定对象是否可以扩展
var o = {name: 'zhang'}
var res1 = Object.isExtensible(o)
Object.preventExtensions(o)
var res2 = Object.isExtensible(o)
console.log(res1, res2) // true false
2-2:密封的对象
Object.seal(o)
密封对象不可扩展,而且已有成员的[[Configurable]]特性被设置为false,意味着不能删除属性和方法。不可增加,不能删除。
var o = {name: 'Li'}
Object.isSealed(o) // false
Object.seal(o)
Object.isSealed(o) // true
Object.isSealed(o)
检测时候被密封了(《前端之路》之 JavaScript 进阶技巧之高阶函数(下)的更多相关文章
- JavaScript之闭包与高阶函数(一)
JavaScript虽是一门面向对象的编程语言,但同时也有许多函数式编程的特性,如Lambda表达式,闭包,高阶函数等. 函数式编程是种编程范式,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 ...
- JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)
上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...
- python进阶学习之高阶函数
高阶函数就是把函数当做参数传递的一种函数, 例如: 执行结果: 1.map()函数 map()接收一个函数 f 和一个list, 并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 l ...
- JavaScript(1)高阶函数filter、map、reduce
前言 需求:有这样一个数组[10, 20, 110, 200, 60, 30, 40] 1.筛选出数组中小于100的元素 2.将筛选出的每个元素的值x2 3.完成第2步之后,将数组中的所有元素加起来 ...
- JavaScript进阶之高阶函数篇
JavaScript进阶之高阶函数篇 简介:欢迎大家来到woo爷说前端:今天给你们带来的是JavaScript进阶的知识,接下来的系列都是围绕着JavaScript进阶进行阐述:首先我们第一篇讲的是高 ...
- 深入理解javascript函数进阶系列第一篇——高阶函数
前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...
- JavaScript系列--JavaScript数组高阶函数reduce()方法详解及奇淫技巧
一.前言 reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值. reduce() 可以作为一个高阶函数,用于函数的 compose. reduce()方 ...
- JavaScript ES6函数式编程(一):闭包与高阶函数
函数式编程的历史 函数的第一原则是要小,第二原则则是要更小 -- ROBERT C. MARTIN 解释一下上面那句话,就是我们常说的一个函数只做一件事,比如:将字符串首字母和尾字母都改成大写,我们此 ...
- JavaScript高阶函数
所谓高阶函数(higher-order function) 就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数. 下面的例子接收两个函数f()和g(),并返回一个新的函数用以计算f(g ...
随机推荐
- error LNK2001: 无法解析的外部符号 "public: char * __thiscall
error LNK2001: 无法解析的外部符号 "public: char * __thiscall CamPinPadCtrl::KeysConvert(unsigned long,ch ...
- Spring+Redis的部署与Redis缓存使用示例
由于项目的业务需要,这两天折腾了一下Spring-redis配置,有了前面用Spring托管hibernate的经验,这次可以说是顺风顺水,大概说一下流程. ubuntu 安装 redis sudo ...
- Django中使用富文本编辑器Uedit
Uedit是百度一款非常好用的富文本编辑器 一.安装及基本配置 官方GitHub(有详细的安装使用教程):https://github.com/zhangfisher/DjangoUeditor 1. ...
- github page 配置hexo 博客 的常见错误
缘起 最近看到好多的公众号作者推荐大家搭建自己的博客,自己手痒也搭建了一个个人博客lumang,具体过程就是一开始上网搜索一番教程,按照教程开始搭建,由于是windows的环境,同时教程也有很多的老旧 ...
- IBM x3850 RAID5数据恢复过程
[raid数据恢复故障描述] 需要进行数据恢复的是北京一家公司的IBM X3850服务器,服务器挂载了5块73G SAS硬盘组成raid5磁盘阵列,4号盘为热备盘(Hot-Spare),由于未知 ...
- Putty连接TPYBorad v102 开发板教程
第一步:下载Putty软件 http://www.micropython.net.cn/download/tool/3.html 第二步:通过USB数据线将TPYBorad与PC相连 第三步:打开设备 ...
- 【转】数据库事务ACID以及事务隔离
本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指 ...
- XamarinForm Effects 调用事件
原文地址 在Xamarin.Forms控件中实现底层多点触控跟踪. 一个effect可以定义和调用一个事件,在底层本地视图中发出信号的变化.这篇文章演示如何实现底层多点触控跟踪,以及如何生成信号触摸活 ...
- SSM-MyBatis-14:Mybatis中智能标签
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 谈论到智能,有什么要想的没有? 我下面放张图 相信都见过这个吧,你在之前没有学习过框架的时候怎么写的,动态sq ...
- Embedded servlet containers
73. Embedded servlet containers 73.1 Add a Servlet, Filter or Listener to an application There are t ...