Skip to content

Latest commit

 

History

History
30 lines (24 loc) · 1.1 KB

use-null-prototypes-to-prevent-prototype-pollution.md

File metadata and controls

30 lines (24 loc) · 1.1 KB

使用null原型以防止原型污染

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

var o = new C();
// 我们得到的依然是一个对象
console.log(Object.getPrototypeOf(o) === null); // false
console.log(Object.getPrototypeOf(o)); // Object {}

// 使用Object.create() 可以创建一个没有原型的对象
var o1 = Object.create(null);
console.log(Object.getPrototypeOf(o1) === null); // true
console.log(Object.getPrototypeOf(o1)); // null

// 使用__proto__ 但是要尽量避免使用这个属性
var o2 = {__proto__: null};
console.log(Object.getPrototypeOf(o2) === null); // true
console.log(Object.getPrototypeOf(o2)); // null

源码


谨记

  • 在ES5环境中,使用Object.create(null)创建的自由原型的空对象是不太容易被污染的。
  • 在一些较老的环境中,考虑使用{__proto__: null}
  • 但要注意__proto__既不标准,也不是完全可移植的,并且可能会在未来的JavaScript环境中去除。
  • 绝不要使用__proto__名作为字典中的key,因为一些环境将其作为特殊的属性对待。