ES6-9 对象密封4种方式、assign、取值函数的拷贝

一 对象密封

1 Object.preventExtensions 禁止对象拓展,仍可删除

  • 严格模式下报错
const origin = {a: 1
}
const fixed = Object.preventExtensions(origin)
console.log(origin === fixed) // true
console.log(Object.isExtensible(origin)) // false 不可拓展
origin.b = 100
console.log(origin) // 不变

2 Object.defineProperty

const obj = {}
obj.b = 1 // 属性描述符全是true
console.log(Object.getOwnPropertyDescriptor(obj, 'b'))
Object.defineProperty(obj, 'c', {value: 100 // 属性描述符全是false
})
console.log(Object.getOwnPropertyDescriptor(obj, 'c'))

3 Object.seal 对象密封 禁止拓展+不可删除,仍可修改

  • 严格模式下报错
const origin = {a: 1
}
const fixed = Object.seal(origin)
console.log(origin === fixed) // true
console.log(Object.isSealed(origin)) // true 密封的
console.log(Object.isExtensible(origin)) // false 不可拓展
delete origin.a 
console.log(origin) // 不变,不可删除
origin.a = 100
console.log(origin) // 不可删除, 仍可修改

4. Object.freeze - 冻结的 不可增删改

const origin = {a: 1
}
const fixed = Object.freeze(origin)
console.log(origin === fixed) // true
console.log(Object.isFrozen(origin)) // true 冻结的
console.log(Object.isSealed(origin)) // true 密封的
console.log(Object.isExtensible(origin)) // false 不可拓展
origin.a = 100
console.log(origin) // 不可修改

二 Object.is

console.log(NaN === NaN) // false
console.log(+0 === -0) // true 
console.log(Object.is(NaN, NaN)) // true 和全等不同的
console.log(Object.is(+0, -0)) // false 和全等不同的
console.log(Object.is({}, {})) // false

三 Object.assign(tar, …sources) 合并对象

const tar = {}
const obj = {a: 1}
const copy = Object.assign(tar, obj)
console.log(copy === tar) // true
// 直接使用tar
  • 属性覆盖:取后写的

  • 当tar是不能转为对象的原始值null/undefined时,报错
    在这里插入图片描述
    在这里插入图片描述

  • source能转成对象,且属性的可枚举性为真,则可以合并得到新的对象
    在这里插入图片描述

  • source为数组时
    在这里插入图片描述

  • Object.assign拷贝的是可枚举属性,继承属性和不可枚举属性不可拷贝
    在这里插入图片描述

const obj = Object.create({ foo: 1 }, {bar: {value: 2 // 只可读},baz: {value: 3,enumerable: true}
})
console.log(obj)
console.log(Object.getOwnPropertyDescriptor(obj, 'bar'))
console.log(Object.getOwnPropertyDescriptor(obj, 'foo')) // 拿不到继承属性的属性描述符
const copy = Object.assign({}, obj)
console.log(copy)
console.log(Object.assign(obj, { extra: 100 }))

Object.assign是浅拷贝

  • 在嵌套的对象里要尤其注意
    在这里插入图片描述

嵌套对象,同名属性会被后者替换

console.log(Object.assign([1,2,3],[4,5]))
// {0: 4, 1: 5, 2: 3}

含getter

在这里插入图片描述
在这里插入图片描述

含setter

在这里插入图片描述
在这里插入图片描述

const obj1 = {set a(val) {this._a = val}
}
obj1.a = 100
const obj2 = Object.assign({}, obj1)
console.log(obj2)

扩充原型上的方法、属性

function Person() { }
Object.assign(Person.prototype, {name: 'hh',eat() { }
})
console.log(Person.prototype)

设置默认项

const DEFAULT = {url: {host: 'www.baidu.com',port: 80}
}
function test(opt) {opt = Object.assign({}, DEFAULT, opt)console.log(opt)
}
test({url: { port: 8080 }
})
test()

在这里插入图片描述

四 Symbol 原始类型

  • 可以看成永远不会重复的字符串
const a = Symbol('1')
const b = Symbol('1')
console.log(a) // Symbol(1)
console.log(b) // Symbol(1)
console.log(a === b) // false
console.log(a == b) // false

五Object.defineProperties/getOwnPropertyDescriptors

  • 获取多个描述/定义多个属性
const obj1 = {}
Object.defineProperty(obj1, 'a', {value: 'a'
})Object.defineProperties(obj1, {b: {value: 'b'},c: {value: 'c'},
})
console.log(Object.getOwnPropertyDescriptor(obj1, 'a'))
console.log(Object.getOwnPropertyDescriptor(obj1, 'b'))
console.log(Object.getOwnPropertyDescriptor(obj1, 'c'))
console.log(Object.getOwnPropertyDescriptors(obj1))

在这里插入图片描述

  • 解决Object.assign不能拷贝setter/getter的问题
const source = {set foo(val) {this.a = val}
}
console.log(source)
const tar = {}
Object.defineProperties(tar, Object.getOwnPropertyDescriptors(source))
console.log(tar)
console.log(Object.getOwnPropertyDescriptors(tar))
tar.foo = 100
console.log(tar)

在这里插入图片描述

  • 拷贝
const source = {a: 100,set foo(val) {this.a = val}
}
const clone = Object.create(Object.getPrototypeOf(source), Object.getOwnPropertyDescriptors(source))
console.log(clone)
clone.foo = 101
console.log(clone)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript --- 使用ajax与服务器进行通信

Ajax: (Asynchronous JavaScript and XML,异步JavaScript与XML技术)是一种有效利用JavaScript和DOM的操作. 与传统HTTP请求的区别: Ajax允许只更新页面的一部分,因此减少了响应中传输的数据量 Ajax的API: Ajax与服务器进行通信,可以使用JavaScript中原生的XMLHttpRequest对象…

ES6-10 super、4种遍历方式、原型、symbol遍历

由于现代 JavaScript 引擎优化属性访问所带来的特性的关系,更改对象的 [[Prototype]]即__proto__在各个浏览器和 JavaScript 引擎上都是一个很慢的操作。 一 Object原型方法 1 Object.setPrototypeOf(obj, proto) 用该方法而不是直接修改__proto__返回值是设置好原…

IntelliJ IDEA使用

1:下载 ideaIU-2017.2.exe,JetbrainsCrack-2.6.2.jar(补丁) 2:安装ideaIU-2017.2.exe,将补丁放在D:\java\intellij\IntelliJ IDEA 2017.2\bin 目录下 3:在安装的idea下面的bin目录下面有2个文件 : 一个是id…

js中如何删除json对象的某一个选项

我有一个这样一个对象,getData, 但是我不想要每一项的id,那怎么去删除呢(使用delete)? getData.map((item) >{delete item["id"];});console.log(getData);转载于:https://www.cnblogs.com/mmykdbc/p/8386407.html

ES6-11 Symbol、iterator、forOf、typeArray

…剩余运算符 const obj1 {a: 1,b: 2 } const obj2 {a: 100,b: 2,c: 300 } const obj {...obj1,...obj2 } console.log(obj) // 和Object.assign(obj, obj1, obj2)结果相同[Symbol.hasInstance] Symbol构造函数上的属性,默认调用了方法 iterator迭代器 对数…

node --- 游走在客户端和服务器间的http

本篇文章,讲述了一个很简单的上传图片(/start)到本地服务器,然后路由跳转到/upload. 写这个程序的目的是为了帮助理解HTTP的一些基本概念及node对于http api的实现以及程序的设计模式. IP: 计算机之间的通信 TCP: 应用程序之间的通信 HTTP: 基于TCP实现的应用层协议,设计之初是…

redis配置环境变量

直接上图不解释 redis安装路径,我的电脑右击属性 窗口R键,输入cmd回车,输入redis-server.exe 回车 再开一个命令窗口,窗口R键,输入cmd回车,输入 redis-cli.exe -h 127.0.0.1 -p 6379 回车 转载于:https:/…

对转义字符的思考

ASCII码 计算机存储文字时用的是二进制,ASCII码就是一张对照表,什么字符对应什么码,将二进制码存储下来0-127位表示基础的ASCII码0-31,和127表示非打印控制字符(如换行、回车、响铃、文头、文尾)32-126表示…

ES6-12 array/数值拓展、ArrayOf、ArrayFrom

要使用…须有迭代器接口 数组方法 构造器上的方法 Array.of()声明数组 替代new Array()的方式声明数组new Array()不传参数返回空数组,只传1个参数时,代表数组长度,内容用empty填充,传多个参数,则代表数组内容&…

React01

目录 React-day01 入门知识React介绍官网React开发环境初始化 SPA脚手架初始化项目(方便,稳定)*通过webpack进行初始化配置镜像地址开发工具配置元素渲染组件及组件状态函数定义组件(无状态)类定义组件(有状态)*组合组件Props属性*State状态*…

算法 --- 反转数组

几个注意点: 1.输出的时候,也要做数字超出处理 2.js中可以使用 str -0 将字符串类型转换成数字类型 ( 注意不是 0) 3.可以使用 num ‘’ 将数字类型转换成字符串类型 4.使用str.split(’’) 可以将字符串转换成数组 5.使用arr.join(’’) 可以将数组转换成字符串 6.JS中2的31次…

ES6-13 正则方法、修饰符yus、UTF_16编码方式

修饰符 m multiLine 对于str中含\n的情况g globali ignoreCase 元字符 反斜杠加转义 元字符含义简写\w匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’。word\W匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。\s匹配任何空白字符,包括空格、制表符、换页…

cmd窗口快速定位到具体文件夹方法

在用Python进行机器实战时,打开cmd窗口后,总是到定位到kNN.py所在文件夹才能Python(否则import kNN失败),每次都要输入地址非常麻烦 这里介绍一个cmd窗口快速定位到具体文件夹方法: 按住Shift键右击鼠标打开…

算法 --- 罗马数字转整数

解体思路: 1.写一个对象trans用于保存罗马和数字之间的映射关系 2.重点在于当数值小的出现在数值大的左边时,会减去该数,出现在右边时会加上该数,因此需要与后面的进行比较 3.在得到s时,首先给它转换成字符串,并在末位加一个0 /*** param {string} s* return {number}*/ var r…

正则 - 阮一峰

学习地址 一 正则实例方法 1. test 正则实例.test返回布尔值 var r /x/g; var s _x_x;r.lastIndex // 0 r.test(s) // truer.lastIndex // 2 r.test(s) // truer.lastIndex // 4 r.test(s) // false死循环,因为while循环的每次匹配条件都是一个新的正则表达式…

算法 --- 有效的括号

解题思路: 1.对括号分别赋值(左括号大于0,右括号小于0),方便后期比较 2.使用栈,对于大于0的字符串入栈,对于小于0的字符串,检查栈中是否有元素,若没有返回false,否则拿出栈顶的一个元素,和现在的元素进行比较 /** * param {string} s * return {boolean} */ var isValid func…

ES6-14 Unicode表示法、字符串方法、模板字符串

Unicode表示法 本身能正常识别的,加{}也能识别,花括号内的内容表示码点 parseInt(0061,16) // 十进制的97,97在ASCII码中对应a console.log(\u0061) // a console.log(\u{0061}) // a console.log(\u{61}) // a原型上方法 codePointAt(十进…

算法 --- 删除数组中重复项

解题思路: 如果输入的数组长度为1,则返回该数组否则(len>2),使用i记录当前待插入的位置,j记录下一个与nums[i]不相等的位置,leng为待返回数组的长度当nums[i] ! nums[j]时,把j位置的值nums[j]放在i1位置.同时i,j /*** param {number[]} nums* return {number}*/ var remov…

如何理解 Linux 中的 load averages

原文:https://mp.weixin.qq.com/s?src11&timestamp1533697106&ver1047&signaturepoqrJFfcNABv4biKKpa4mZdIW7No2Wo1F5sbZL7ggoVS2GqcSqwQQ8hMulAmezT*zL*klB-eE5BeMyNuyjuIH7YgkBAN25i6*ahhEpWyxqx6vPct-Vr7q7AU0YGe-F*l&new1 http://blog.scoutap…

Jsp+Servlet+MYSQL注册登录案例(界面难看,ε=(´ο`*)))唉)

注册登录界面尤为常见,我的界面尤为难看,勉为其难的写吧,前端不熟就是这样。。。 这个案例运用到了: 1.Jsp动态页面--->动态页面 2.Servlet逻辑判断后台---->实现界面与数据库/业务的连接,简而言之,起承转合。PS…