Object总共添加以下几种新方法:
Object.keys()
Object.getOwnPropertyNames();
Object.getPrototypeOf();
Object.defineProperty();
Object.defineProperties();
Object.getOwnPropertyDescriptor();
Object.create();
Object.seal();
Object.freeze();
Object.preventExtensions();
Object.isSealed();
Object.isFrozen();
Object.ixExtensible();
Object.keys()用于收集当前对象的可遍历属性(不包括原型链上的)。以数组形式返回。
Object.getOwnPropertyNames()用于收集当前对象不可遍历和可遍历属性(不包括原型链上的),以数组形式返回。
Object.getPrototypeOf
返回参数对象的内部属性[[prototype]],在标准浏览器中使用私有属性__proto__获取( IE9,IE10,Opera没有)。Object的新API(除Object.create)都规定,要求第一个参数不能为数字、字符串、布尔、null、undefined这5中字面量,否则抛出一个TypeError异常。
isPlainObject 用于判定目标是不是纯净的Javascript对象,且不是其他自定义类的实例。
Object.defineProperty暴露了属性描述的接口。共涉及6个可组合的配置项
(1)writable:是否可重写
(2)value: 当前值
(3)set: 写入时内部调用的函数
(4)get:读取时内部调用的函数
(5)configurable: 是否允许再次改动这些配置项
(6)enumerable:是否可遍历。
数据属性拥有1,2,5,6。
访问器属性拥有3,4,5,6。
若设置了value和writable,就不能设置set和get。反之亦然。如果没有设置,1,5,6默认为false
注意 defineProperty的第三个参数配置好像没有使用hasOwnProperty进行取值,导致一旦Object.prototype被污染,就很容易程序崩溃。
直接定义成下面这样会报错。
若浏览器不支持definePropety
Object.defineProperties是Object.definePropery的加强版,可一次定义多个属性。若浏览器不支持,可以定义如下:
Object.getOwnPropertyDescriptor用于获取某对象的本地属性的配置对象,其中configurable,enumerable肯定包含在其中,视情况再包含value, writable, 或set和get.
Object.preventExtensions,它是三个封锁对象修改API中程度最轻的那个,就是阻止添加本地属性,但是如果本地属性被删除了,也无法再添加回来。
Object.seal 不允许添加本地属性,不准删除已有的本地属性。内部实现就是遍历所有的本地属性,把每个本地属性的configurable改为false;
Object.freeze不许修改本地属性,不准添加本地属性,不准删除本地属性