理解JavaScript对象

对象的属性和访问

作者 Trekerz 日期 2017-11-02
理解JavaScript对象

每个对象都是基于一个引用类型创建的。

ECMAScript有两种属性类型:数据属性访问器属性

1.数据属性

(1) [[Configurable]]

能否用delete删除属性、修改属性特性以及修改为访问器属性,默认true;

(2) [[Enumerable]]

能否通过for-in循环返回属性,默认true;

(3) [[Writable]]

能否修改属性值,默认true;

(4) [[Value]]

包含这个属性的值,默认undefined。

注意1:要修改以上属性的特性值,必须用Object.defineProperty(属性所在对象,属性名字,一个描述符对象(可包含多个描述符名值对) )。如果是用此方法创建一个属性,则不赋值的话默认是false。

注意2:如果[[Writable]]被设为false后还进行赋值,非严格模式下会忽略,严格模式下报错。

注意3:一旦把[[Configurable]]设为false,就不能再把它变回可配置的了。

2.访问器属性

不包含数据值,读取时会调用getter函数,写入时会调用setter函数。

(1) [[Configurable]]

能否用delete删除属性、修改属性特性以及修改为访问器属性,默认true;

(2) [[Enumerable]]

能否通过for-in循环返回属性,默认true;

(3) [[Get]]

读取时调用的函数,默认undefined;

(4) [[Set]]

写入时调用的函数,默认undefined;

注意1:访问器属性不能直接定义,需用Object.defineProperty()。

注意2:get(一个指向getter函数的指针)和set函数支持IE9+,在IE8以前使用defineGetter()和defineSetter()。

3.同时定义多个属性

(1) Object.defineProperty()

接收3个参数:属性所在对象、属性名字(可以是包含多个属性的一个对象)、一个描述符对象(可包含多个描述符名值对)。可以一次定义多个属性里的多个特性值。

4.读取属性的特性

(1) Object.getOwnPropertyDescriptor()

接收2个参数:属性所在对象、属性名称。返回的是一个包含所有属性特性名值对的对象。

注意:在实例上调用时只取得实例本身的属性,不能取得原型上的属性(访问原型上的属性需要另外在原型对象上调用此方法)。


end -