博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Effective JavaScript 笔记]第44条:使用null原型以防止原型污染
阅读量:5218 次
发布时间:2019-06-14

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

第43条中讲到的就算是用了Object的直接实例,也无法完全避免,Object.prototype对象修改,造成的原型污染。防止原型污染最简单的方式之一就是不使用原型。在ES5之前,并没有标准的方式创建一个空原型的新对象。

尝试

设置构造函数的原型属性为null或undefined

function C(){}C.prototype=null;

结果

实例化该构造函数仍然得到是Object的实例。

var c=new C();Object.getPrototypeOf(c) === null;//falseObject.getPrototypeOf(c) === Object.prototype;//true

ES5标准方法

ES5提供了标准方法来创建一个没有原型的对象。Object.create函数能够使用一个用户指定的原型链和一个属性描述符动态地构造对象。属性描述符描述了新对象属性的值及特性。通过简单传递一个null原型参数和一个空的描述符,就可以建立一个真正的空对象。

var x=Object.create(null);Object.getPrototypeOf(x)==null;//true

原型污染无法影响这样的对象。

兼容版本

一些不支持Object.create函数的旧的js环境可能支持__proto__属性,对象字面量也支持初始化一个原型链为null的新对象。

var x={__proto__:null};x instanceof Object;//false

上面的方法也很有效,但在有标准方法后,标准方法是更好的选择。

注意

__proto__属性是非标准的并且并不是所有环境都可以移植的。js的实现者们并不能保证以后仍然支持它,所以有标准方法,尽量先考虑标准方法。

可以看出,虽然__proto__可以解决问题,但也引入它自身平台不兼容的问题,阻止自由原型对象作为真正健壮的字典实现。更健壮的方法,在下一条中会提到。

提示

  • 在ES5环境中,使用Object.create(null)创建的自由原型的空对象是不太容易被污染的

  • 在一些较老的环境中,考虑使用{__proto__:null}

  • 但要注意__proto__既不标准,也不是完全可移植的,并且可能会在未来的js环境中去除

  • 绝不要使用"__proto__"名作为字典的key,因为一些环境将其作为特殊的属性对待。

转载于:https://www.cnblogs.com/wengxuesong/p/5613178.html

你可能感兴趣的文章
SQL Server 如何查询表定义的列和索引信息
查看>>
项目上传到github上
查看>>
GCD 之线程死锁
查看>>
NoSQL数据库常见分类
查看>>
JS小工具_字符串转16进制数组_02
查看>>
信息安全系统设计基础实验四—20135214万子惠20135227黄晓妍
查看>>
一题多解 之 Bat
查看>>
Linux防火墙
查看>>
IOS —— srollView中的一些实战案例
查看>>
Mui
查看>>
getopt 和argc argv的联合使用
查看>>
vtun 源码中nat什么意思
查看>>
MyEclipse安装主题(Color Theme)
查看>>
c++中const变量定义与头文件包含的有关问题
查看>>
8个超棒的学习 jQuery 的网站[转]
查看>>
父窗口与iFrame之间调用方法和元素
查看>>
【WP 8.1开发】How to 图像处理
查看>>
Swift2.0语言教程之类的属性
查看>>
【Linux】- Ubutnu UFW防火墙的简单设置
查看>>
require.js(浅聊)
查看>>