深入理解JavaScript对象的自有属性以及属性描述符
在JavaScript中,按照对象属性的访问特性,Object对象中存在两种类型的属性:
1.共有属性,对象实例共有的属性,所有对象实例都可用,可以从原型链上查找的属性,可被for in或者Object.keys枚举到
2.自有属性,对象实例私有的属性,只有该对象实例可用,不可从原型链上查找的属性,不可被for in或者Object.keys枚举到
可以看到,其实,Object本身也是一个对象,那么它是谁的实例呢?是的,没错,它就是Function的一个实例。
所以其实可以看到下面两段这样的代码的执行结果:
Object instanceof Function //true
Function instanceof Object //true
作为一个对象,那么当然它可以作为下面API的一个参数,当然Object下有prototype属性,于是:
Object.getOwnPropertyDescriptor(Object,"prototype"),结果是什么呢?
屏蔽proto以及value,可以看到
configurable: false
enumerable: false
writable: false
这样的执行结果,那么这说明了该属性不可被删除,不可被枚举,不可被修改。
这也就是说当我们试图赋值给Object.prototype时,该操作是无效的,因为它不可被修改。
现在来谈谈JavaScript对象的数据属性和访问器属性
proto就是一个访问器属性,获取该属性的值时通过调用getter去获取,修改该属性的值时通过调用setter来修改,换句话来说,我们是无法直接操作proto的,操作时内部实际都是通过这样的方式在内部操作的,只是对外屏蔽了内部操作实现,只对外提供了操作的方式,仅此而已。
而且通过Object.getOwnPropertyDescriptor(Object,"proto")查看属性描述符没有任何结果返回