JavaScript对象
JavaScript对象
1.理解对象
1.1 对象的定义
方法一:创建Object的一个新的实例,然后再给它添加属性和方法
let person1 = new Object();
person1.name = "cai";
person1.sex = "女";
方法二:使用字面量创建
let person2 = {
"name": "wang",
"sex": "女",
5: true,
"age": 15,
};
1.2 属性的类型
属性分为两种:数据属性和访问器属性
1.数据属性
数据属性包含一个保存数据值的位置,值会从这个位置读取,也会写入到这个位置。数据属性有四个特性描述它们的行为
特性 | 描述 |
---|---|
Configurable | 表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。默认情况下值为true |
Enumberable | 表示是否可以通过for-in循环返回。默认情况下,所有直接定义在对象上的这个特性都是true |
Writable | 表示属性的值是否可以修改。默认值为true |
Value | 包含属性实际的值。默认值为undefined |
Object.defineProperty()方法用于修改默认特性。
例子:
let person = {};
Object.defineProperty(person, "name", {
writable: false,
configurable: false,
value: 'caicai'
});
console.log(person.name); //caicai
person.name = "wangwang";
console.log(person.name); //caicai
delete person.name;
console.log(person.name); //caicai
2.访问器属性
访问器属性不含数据值。相反,它们包含一个获取(getter)函数和一个设置(setter)函数,不过这两个函数不是必须的。
在读取访问器属性时,会调用获取函数,这个函数的责任就是返回一个有效的值。在写入访问器属性是,会调用设置函数并传入新值,这个函数必须决定对数据做出什么修改。它也有四个特性描述它们的行为:
特性 | 描述 |
---|---|
Configurable | 表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为数据属性。默认值为true |
Enumerable | 表示属性是否可以通过for-in循环访问。默认值为true |
Get | 获取函数,在读取属性时调用。默认值为undefined |
Set | 设置函数,在写入属性时调用。默认值为undefined |
例子:
let book = {
year_: 2017,
edition: 1
};
Object.defineProperty(book, "year", {
get() {
return this.year_;
},
set(value) {
if (value > 2017) {
this.year_ = value;
this.edition += value - 2017;
}
}
});
book.year = 2018;
console.log(book.edition);//2
3.定义多个属性
定义多个属性使用方法Object.defineProperties()方法
//定义多个属性
let bookA = {};
Object.defineProperties(bookA, {
year_: {
value: 2017
},
edition: {
value: 1
},
year: {
get: function() {
return this.year_;
},
set: function(value) {
if (value > 2017) {
this.year_ = value;
this.edition += value - 2017;
}
}
}
});
4.读取属性的特性
使用方法Object.getOwnPropertyDescriptor()可以取得指定属性的属性描述符。这个方法接收两个参数:属性所在的对象和要取得其描述符的属性名。
ECMAScript2017新增了Object.getOwnPropertyDescriptors()静态方法,这个方法实际上会在每个自有属性上调用Object.defineProperties()并在一个新对象中返回它们。
例子:
//读取属性的特性
let desc = Object.getOwnPropertyDescriptor(bookA, "year_");
console.log(desc.value);
console.log(desc.configurable);
console.log(typeof desc.get);
let desc1 = Object.getOwnPropertyDescriptor(bookA, "year");
console.log(desc1.value);
console.log(desc1.enumerable);
console.log(typeof desc1.get);
let desc2 = Object.getOwnPropertyDescriptors(bookA);
console.log(desc2);
5.合并对象
ECMAScript6专门为合并对象提供了Object.assign()方法。
这个方法接收一个目标对象和一个多源对象作为参数,然后将每个源对象中可枚举和自有属性赋值到目标对象。以字符串和符号为键的属性会被复制。对每个符合条件的属性,这个方法会使用源对象上的[[Get]]取得属性的值,然后使用目标对象的[[Set]]设置属性的值。
例子:
let desc3 = {};
let src = {
id: "src"
};
let resultA = Object.assign(desc3, src);
console.log(desc3 === resultA); //true
console.log(desc3 !== src); //true
console.log(resultA); //{id: 'src'}
console.log(desc3); //{id: 'src'}
//多个源对象
let result, dest;
dest = {};
result = Object.assign(dest, {
a: "a"
}, {
b: "b"
});
console.log(result);
// assgin覆盖相同属性 (代码略)
Object.assign()实际上对每个源对象执行的是浅复制
6.对象标识以及相等判断
方式一:===操作符
方式二:Object.is()方法 ,一些特殊情况可使用该方法判断,如:要确定NaN的相等性,使用NaN===NaN会返回false,在ES6之前只能使用isNaN(),ES6之后就可以使用Object.is(),Object.is(NaN,NaN)返回true。
//对象标识以及相等判断
//===操作符;
console.log(true === 1);
console.log({} === {});
console.log("2" === 2);
//Object.is();
console.log(Object.is(true, 1));
console.log(Object.is({}, {}));
console.log(Object.is("2", 2));
7.增强对象的语法
参考书籍:《JavaScript程序设计》第4版 Matt Frisbie