《JavaScript 高级程序设计》学习总结六(1)
引言:前面的一章我们已经介绍了引用类型,其中在那一章我们大概了解到了“对象”这个概念。同时也提到 JavaScript 中函数也是对象,甚至可以提出“万物皆对象的概念”。那么在这一章我开始就对 JavaScript的“对象”开始一个学习总结,首先我们可以了解的是,面向对象都有一个“类”的概念。而通过类可以创建任意多个具有相同属性的方法和对象,但是在ECMAScript 中却没有类的概念。这也是JavaScript 不同于一般的面向对象的特别之处。对象在JavaScript中是一个重要知识点,所以这一章的内容会比较长,总结方面结构上我会依旧采用分章节总结,内容上我尽量不会偏基础的知识点,因为很多知识点我已经在前面有过多次提到(比如创建对象。添加属性等等),所以可以说这个总结方向会随着章节会慢慢的越来越不偏向基础,而是慢慢偏向一些难点,这也是我想要做的。而在一些知识点我也会尽量通过自己的积累来进行解释,尽量不全搬书上,这样一来无论是对自己的学习提升还是内容的补充都是很好的(其实我在前面几章也是这么做的)。
属性类型:
ECMASCript 中有两种属性:数据属性和访问器属性。
数据属性:
数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有 4 个描述其行为的 特性。
1、 [[Configurable] kən'fɪgərəbl ]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特 性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的 这个特性默认值为 true。
2、[[Enumerable ] ɪ'nju:mərəbəl]]:表示能否通过 for-in 循环返回属性。像前面例子中那样直接在对象上定 义的属性,它们的这个特性默认值为 true。
3、[[Writable]'raɪtəbəl ]:表示能否修改属性的值。像前面例子中那样直接在对象上定义的属性,它们的 这个特性默认值为 true。
4、[[Value] vælju ] :包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候, 把新值保存在这个位置。这个特性的默认值为 undefined。
对于像前面例子中那样直接在对象上定义的属性,它们的[[Configurable]]、[[Enumerable]] 和[[Writable]]特性都被设置为 true,而[[Value]]特性被设置为指定的值。例如:
var person = { name: "Nicholas" }; 这里创建了一个名为 name 的属性,为它指定的值是"Nicholas"。
也就是说,[[Value]]特性将 被设置为"Nicholas",而对这个值的任何修改都将反映在这个位置。
要修改属性默认的特性,必须使用 ECMAScript 5 的 Object.defineProperty()方法。这个方法 接收三个参数:属性所在的对象、属性的名字和一个描述符对象。其中,描述符(descriptor)对象的属 性必须是:configurable、enumerable、writable 和 value。设置其中的一或多个值,可以修改 对应的特性值。
把 configurable 设置为 false,表示不能从对象中删除属性。如果对这个属性调用 delete,则 在非严格模式下什么也不会发生,而在严格模式下会导致错误。而且,一旦把属性定义为不可配置的, 就不能再把它变回可配置了。此时,再调用 Object.defineProperty()方法修改除 writable 之外 的特性,都会导致错误,比如:
1 var person = {}; 2 3 Object.defineProperty(person, "name", { 4 5 configurable: false, 6 7 value: "Nicholas" 8 9 }); //抛出错误 10 11 Object.defineProperty(person, "name", { 12 13 configurable: true, 14 15 value: "Nicholas" 16 17 });
更多相关文章
- 如何从Java中的类名获取类对象
- 域对象/服务和业务逻辑层
- JavaScript笔记:混合对象“类”
- [零基础学JAVA]Java SE面向对象部分.面向对象基础(04)
- Java面向对象三大特性
- 请问java中调用一个静态方法()内传入一个对象是表示什么意思?
- Java记录 -88- 利用反射机制调用对象的私有方法和属性
- Java开发水吧点饮品系统(顶层父类对象做接口参数)
- 如何知道Object是否为String类型对象?