JS中的属性类型理解
2017-02-14 09:47
239 查看
ECMAScript(第五版)中有两种属性:数据属性和访问器属性。
在阅读JavaScript高级程序设计第三版时出现一些疑问:
书中139页提到数据属性:
数据属性包含一个数据值的位置。在这个位置可以读取和写入值
第一个问题:这里面的name属性是数据属性?
书中141页提到访问器属性:
第二个问题:上行代码为什么没有给book新添加一个year属性?
第三个问题:如果上行代码注释掉,alert(book.year)为undefined。不注释的话alert(book.year)警告框显示2005. 可是book中并没有添加一个year属性,为什么在执行上一行代码以后便可以alert了?弹出的值是_year的值,证明book.year访问的是_year了吧?_year不是只能通过对象方法访问么?为什么直接alert(book.year)便可以访问了?
问题回答:
1.name 是数据属性。书上说数据属性包含一个数据的位置。在这个位置可以读取和写入值。言下之意即,数据属性是可以直接通过对象.属性的形式访问和赋值的。题中name可以这样做。所以它是一个数据属性。
2.通过 Object.defineProperty() 方法,可以创建数据属性(并设定其[[Enumerable]]等内部属性),也可以创建访问器属性(访问器属性仅包含 getter 和 setter函数,当然这两个也不是必须的)。第二问中这样的创建方式即创建了 book 对象的访问器属性,而非数据属性.
3.接第二点,year (当然名字可以自定义,随便取)是 book 对象一个访问器属性。直接调用 book.year,即调用了这个访问器属性中定义的 get 方法,返回 book._year 这个数据属性。如果给 book.year 赋值,就是调用了这个访问器属性中定义的 set 方法。可以在 get 和 set 方法体中分别加入 console.log(“某个字符”),这样的代码,再调用 book.year 或给其赋值,应该就明白了。数据属性不仅可以直接访问,也可以通过定义的访问器来专门访问。
在阅读JavaScript高级程序设计第三版时出现一些疑问:
书中139页提到数据属性:
数据属性包含一个数据值的位置。在这个位置可以读取和写入值
var person = { name : "Nicholas" }
第一个问题:这里面的name属性是数据属性?
书中141页提到访问器属性:
var book = { _year : 2004,//_year前面下划线是常用的记号,表示只能通过对象方法访问的属性 edition : 1 }; Object.defineProperty(book,"year",{ get : function () { return this._year; }, set : function (newValue) { if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2005;
第二个问题:上行代码为什么没有给book新添加一个year属性?
第三个问题:如果上行代码注释掉,alert(book.year)为undefined。不注释的话alert(book.year)警告框显示2005. 可是book中并没有添加一个year属性,为什么在执行上一行代码以后便可以alert了?弹出的值是_year的值,证明book.year访问的是_year了吧?_year不是只能通过对象方法访问么?为什么直接alert(book.year)便可以访问了?
问题回答:
1.name 是数据属性。书上说数据属性包含一个数据的位置。在这个位置可以读取和写入值。言下之意即,数据属性是可以直接通过对象.属性的形式访问和赋值的。题中name可以这样做。所以它是一个数据属性。
2.通过 Object.defineProperty() 方法,可以创建数据属性(并设定其[[Enumerable]]等内部属性),也可以创建访问器属性(访问器属性仅包含 getter 和 setter函数,当然这两个也不是必须的)。第二问中这样的创建方式即创建了 book 对象的访问器属性,而非数据属性.
3.接第二点,year (当然名字可以自定义,随便取)是 book 对象一个访问器属性。直接调用 book.year,即调用了这个访问器属性中定义的 get 方法,返回 book._year 这个数据属性。如果给 book.year 赋值,就是调用了这个访问器属性中定义的 set 方法。可以在 get 和 set 方法体中分别加入 console.log(“某个字符”),这样的代码,再调用 book.year 或给其赋值,应该就明白了。数据属性不仅可以直接访问,也可以通过定义的访问器来专门访问。
相关文章推荐
- JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
- js学习笔记 Function类型属性的理解
- js创建表格、创建input、判断浏览器类型、设置新创建的input的name属性
- JavaScript学习点滴—js对象的四种类型的属性、方法的访问
- JS中prototype属性的理解
- 属性类型-区间与比率的理解
- js 属性类型
- 关于js中类的静态属性和实例属性的理解
- js里面的属性和方法类型
- JS通过分析userAgent属性来判断浏览器的类型及版本
- 深入理解数据类型、变量类型属性、内存四区和指针
- js string类型属性and函数
- JS如何判断属性类型
- js的属性和方法的类型
- JS通过分析userAgent属性来判断浏览器的类型及版本
- 收藏《JS 事件类型及属性》
- js中为什么不能为值类型的变量动态添加属性呢?
- 使用Javascript和prototype.js框架创建类型及其相关的prototype属性的简单介绍
- 从一个简单例子来理解js引用类型指针的工作方式
- JS 控制VIEWPORT属性,在不同终端类型中兼容自适应显示