博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何创建一个“纯净”的对象
阅读量:6223 次
发布时间:2019-06-21

本文共 1907 字,大约阅读时间需要 6 分钟。

如何创建一个“纯净”的对象

⭐️ 更多前端技术和知识点,搜索订阅号 JS 菌 订阅

首先来看一段代码 ?

Object.prototype.log = ''let obj = {    name: 'oli',    age: 12}for (const key in obj) {    console.log(key) // name age log}复制代码

假设 Object 的原型中有一个自定义的 log 属性,我们用字面量语法定义 obj 对象,那么使用 for-in 遍历方法就会遍历到这个 log 对象,为了只遍历其自身的属性,需要增加一层筛选

Object.prototype.log = ''let obj = {    name: 'oli',    age: 12}for (const key in obj) {    if (obj.hasOwnProperty(key)) { // 检查是否是自身的属性        console.log(key) // name age    }}复制代码

虽然这样能够避免打印原型上的属性,但仍然比较麻烦 ?

接下来我们尝试用 Object.create 方法来创建对象

Object.prototype.log = ''let obj = Object.create(null) // 传入 null 作为参数obj.name = 'oli'obj.age = 12for (const key in obj) {    console.log(key)}复制代码

这样就不会打印出原型上的属性了

我们再来看下 Object.create 和字面量语法创建一个空对象有什么区别

可以看到使用 create 方法并传入 null 作为参数可以避免原型被继承

字面量语法与 Object.create(Object.prototype) 是一样的

那么 create 方法到底做了什么呢 ?

我们直接去看 MDN 有关这个方法的 polyfill

if (typeof Object.create !== "function") {    Object.create = function (proto, propertiesObject) {        if (typeof proto !== 'object' && typeof proto !== 'function') {            throw new TypeError('Object prototype may only be an Object: ' + proto);        } else if (proto === null) {
throw new Error("This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument."); } if (typeof propertiesObject != 'undefined') { throw new Error("This browser's implementation of Object.create is a shim and doesn't support a second argument."); }+ function F() {}+ F.prototype = proto;+ return new F(); };}复制代码

重点看这里,create 方法的内部创建了一个函数,这个函数的原型指向 proto 并返回通过 new 操作符创建的函数的实例

因此用 create 方法创建的新的对象拥有原型上的属性也是正常了 ?

很多时候就像第一段代码一样我们并不需要遍历原型上的属性和方法

使用 create 方法并传入 null 就能避免打印出原型上的方法

或者手动将 __proto__ 设置为 null

obj1 = {
name: 'oli'}obj1.__proto__ = null复制代码

?

请关注我的订阅号,不定期推送有关 JS 的技术文章,只谈技术不谈八卦 ?

转载于:https://juejin.im/post/5cba8a2df265da037c7ce159

你可能感兴趣的文章
最优方案实现同步数据至HUBSPOT
查看>>
vue应用产品之iShow H5编辑器
查看>>
阿里云前端周刊 - 第 17 期
查看>>
是谁传给了constructor参数
查看>>
canvas之路径绘制
查看>>
兼容ie9以下的polyfill类库
查看>>
使用Element-ui开发管理后台
查看>>
基于HTML5快速搭建TP-LINK电信拓扑设备面板
查看>>
IMWeb前端提升营七天学习总结
查看>>
unix文件描述符
查看>>
HTML5设备传感器总结
查看>>
JVM系列-04-JDK自带的管理分析工具
查看>>
videojs系列之二-完善一点点
查看>>
Safari 10默认禁用Flash插件
查看>>
7道常见的数据分析面试题
查看>>
Go语言很好很强大,但我有几个问题想吐槽
查看>>
工作的未来:敏捷人士瑞典大会上午议程回顾
查看>>
“认知计算”如何有效释放数据价值
查看>>
采访与书评 —— 《BDD In Action》
查看>>
Java永久代去哪儿了
查看>>