JavaScript高级程序设计(第3版)|JavaScript高级程序设计(第3版) 笔记

第六章 面向对象的程序设计
6.1 理解对象 6.1.1 属性类型

  • ECMAScript 中有两种属性: 数据属性和访问器属性
  • 数据属性:
    • [[Configurable]] : 表示能否通过delete删除属性从而重新定义属性
    • [[Enumerable]] : 表示能否通过for-in循环返回属性
    • [[Writable]] : 表示能否修改属性的值。
    • [[value]] : 表示这个属性的数据值。
var person = { name: "Jay", } console.log(person.name); // Jay person.name = "Lucy"; console.log(person.name); // Lucy

【JavaScript高级程序设计(第3版)|JavaScript高级程序设计(第3版) 笔记】默认可以修改,可以使用Object.defineProperty()方法。接受三个参数:a:属性所在的对象、b:属性的名字、c: 一个描述符对象。,描述符对象的属性必须是:configurable、enumerable、writable、value。
var person = {} Object.defineProperty(person, "name", { writable:false, value: "Jay" }) console.log(person.name); // Jay person.name = "Lucy"; console.log(person.name); // Jay

在调用Object.defineProperty()方法创建一个新的属性时,如果不指定,configurable、enumerable和writable 特性的默认值都是false
  • 访问器属性
    访问器属性不包括数据值;有getter和setter函数。在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如歌处理数据。
  • [[ Configurable ]] : 表示能否通过delete删除属性从而重新定义。
  • [[ Enumerable ]] : 表示能否通过for-in 循环返回属性。
  • [[ Get ]] :在读取属性时调用的函数,默认值:undefined。
  • [[ Set ]] : 在写入属性时调用的函数,默认值:underfined。
    访问器属性不能直接定义,必须使用Object.defineProperty()来定义。
var person = { _name: "Jay", age: "18" }; Object.defineProperty(person,"name",{ get: function(){ return this._name; }, set: function(newName){ if(this._name !== newName){ this._name = newName; this.age+= newName } } }); person.name = "Lucy"; console.log(person.age); // 18Lucy

6.1.2 定义多个属性
  • Object.defineProperties()方法。利用这个方法可以通过描述符一次定义多个属性。接受两个参数:a:要添加和修改其属性的对象,b: 对象的属性与第一个对象中要添加或修改的属性一一对应。
var book = {}; Object.defineProperties(book, { _year: { writable: true, value: 2000 }, edition: { writable: true, value: 1 }, year: { get: function() { return this._year; }, set: function(newValue) { if(newValue > 2000) { this._year = newValue; this.edition += newValue - 2000; } } }, }) book.year = 2018; console.log(book.edition); // 19

6.1.3 读取属性的特性
  • Object.getOwnPropertyDescriptor() 方法,可以取得给定属性的描述符。接收两个参数: a: 属性所在的对象; b: 要读取其描述符的属性名称。返回值是一个对象,如果是访问器属性,这个对象的属性有:configurable、enumerable、get、set。 如果是数据属性,这个对象的属性有: configurable、enumerable、writable、value。
var book = {}; Object.defineProperties(book, { _year: { writable: true, value: 2000 }, edition: { writable: true, value: 1 }, year: { get: function() { return this._year; }, set: function(newValue) { if(newValue > 2000) { this._year = newValue; this.edition += newValue - 2000; } } }, }) var descriptor = Object.getOwnPropertyDescriptor(book, "_year"); console.log(descriptor.value); // 2000 console.log(descriptor.configurable); // false console.log(typeof descriptor.get); // undefined var descriptor = Object.getOwnPropertyDescriptor(book,"year"); console.log(descriptor.value); // undefined console.log(descriptor.enumerable); // false console.log(typeof descriptor.get); // function

6.2 创建对象

    推荐阅读