《JavaScript高级程序设计(第三版)》读书笔记03 面向对象的程序设计
程序员文章站
2022-03-06 12:29:21
...
对象简介
定义: 无需属性的集合,属性可以包含基本值、对象或者函数。
通俗理解: 对象是一组没有特定顺序的值,好比一组名值对,值可以是数据或者函数。
6.1 理解对象
1、 创建对象
- 最简单方式(不实用):创建Object实例,再添加属性和方法
var person = vew Object();
person.name = "Jay Chou";
person.age = 29;
person.job = "Singer";
person.sayName = function(){
alert(this.name);
}
- 对象字面量方式(实用)
var person = {
name: "Jay Chou",
age: 29,
job: "Singer",
sayName: function(){
alert(this.name);
}
}; // 此处有分号
2、属性类型
只有内部才用的特性描述了属性的各种特征。特性是内部值,放在两对方括号中,例如[[Enumerable]]
。
ECMAScript有两种属性:数据属性和访问器属性。
- 数据属性
数据属性包含一个数据值的位置,这个位置可以读取和写入。
1.1 数据属性有4个描述其行为的特性:
-
[[Configurable]]
:是否可配置:能否通过delete删除属性,能否修改属性的特性,或能否修改为访问器属性。 -
[[Enumerable]]
:能否通过for-in
循环返回属性。 -
[[writable]]
:能否修改属性的值。 -
[[value]]
:包含这个属性的数据值。读取和写入在这个位置,默认为undefined
。
// 举例,直接在对象上定义的属性
var person = {
name: "Jay Chou"
};
例子中,只有[[value]]
被设置成Jay Chou
,其他特性都默认为true
。
1.2 修改属性默认的特性
使用Object.defineProperty()
方法,接收三个参数:属性所在的对象,属性的名字,一个描述符对象。
1)修改属性值
var person = {};
Object.defineProperty(person,"name",{ // 创建一个名为name的属性
writable: false, // 不可修改属性的值
value: "Nicholas" // 设置值
});
alert(person.name); // "Nicholas"
person.name = "Greg";
alert(person.name); // "Nicholas"
2)不可配置的属性
var person = {};
Object.defineProperty(person,"name",{
configurable: false, // 不能从对象中删除属性
value: "Nicholas"
});
alert(person.name); // "Nicholas"
delete person.name;
alert(person.name); // "Nicholas"
3)不可配置不能再变为可配置
可以多次调用Object.defineProperty()
修改同一个属性,但是把configurable
特性设置为false
之后就有限制了。
var person = {};
Object.defineProperty(person, "name", {
configurable: false,
value: "Nicholas"
});
// 抛出错误
Object.defineProperty(person, "name", {
configurable: true, // 不可配置--X--可配置
value: "Nicholas"
});
- 访问器属性
访问器属性不包含数据值,包含一对getter
setter
函数。读取访问器属性时,调用getter
,返回有效的值。写入时调用setter
传入新值,处理数据。
2.1 访问器属性有4个特性
[[configurable]]
[[Enumerable]]
-
[[Get]]
:默认为undefined
。 -
[[Set]]
:默认为undefined
。
2.2 定义访问器属性
不能直接定义,要使用Object.defineProperty()
定义
不一定要同时指定getter
setter
,只指定一个意味着另一个不能读/写
var book = { // 创建了一个book对象,定义了两个默认的属性
_year: 2004, // _year的下划线是一种常用的几号,用于表示只能通过对象方法访问的属性
edition: 1
};
Object.defineproperty(book, "year", { // 访问器属性year
get: funtion(){
return this._year;
},
set: funtion(newValue){
if(newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition); // 2
3、定义多个属性
用Object.defineProperties()
,接收两个对象参数:1. 要添加和修改其属性的对象 2. 第二个对象的属性与第一个对象中要添加或修改的属性一一对应
var book = {};
Object.definePropertyies(book, {
_year: { // 数据属性
writable: true,
value:2004
},
edition: { // 数据属性
writable: true,
value: 1
},
year: { // 访问器属性
get: function(){
return this._year;
},
set: function(newValue){
if(newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
4、读取属性的特性
使用Object.getOwnPropertyDescriptor()
方法,取得给定属性的描述符。接收两个参数:1. 属性所在的对象 2. 要读取其描述符的属性名称。返回值是一个对象。
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if(newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
alert(descriptor.value); // 2004
alert(descriptor.configurable); // false
alert(typeof descriptor.get); // "undefined"
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value); // undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); // "function"
6.3 继承
推荐阅读
-
JavaScript面向对象程序设计创建对象的方法分析
-
JavaScript面向对象的程序设计(犯迷糊的小羊)
-
重学js之JavaScript 面向对象的程序设计(创建对象)
-
javascript高级程序设计第三版 第六章 面向对象的程序设计
-
JavaScript高级程序设计第三版-读书笔记1
-
《JavaScript高级程序设计(第三版)》读书笔记01 变量、作用域和内存问题
-
JavaScript高级程序设计第三版-读书笔记3
-
《JavaScript高级程序设计(第三版)》读书笔记02 引用类型
-
JavaScript高级程序设计(第三版)第二章读书笔记
-
《JavaScript高级程序设计 第三版》第6章 面向对象的程序设计