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 创建对象
推荐阅读
- 事件代理
- 数组常用方法一
- 唐嫣可真会穿,西装搭牛仔裤都能穿出高级感,一双大长腿太抢镜
- 鹿鸣高级营养老师徐老师分享应该注意的6种食物
- Java基础-高级特性-枚举实现状态机
- HTTP高级(Cookie,Session|HTTP高级(Cookie,Session ,LocalStorage )
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Kotlin泛型的高级特性(六)
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- Swift高级应用|Swift高级应用 -01