Chapter05----面向对象编程
一、理解对象(对象的属性)
1.数据属性
[[Configurable]]
:
表示属性是否可以使用delete删除并重新定义,是否可以修改它的特性,以及是否可以把它修改为访问器属性。所有直接定义在对象上的属性,该特性默认为true。const target = {}; Object.defineProperty(target, "date", { configurable: false, // 不允许配置date value: "2022" }); delete target.date; // 删除date属性无效 console.log(target.date); // 2022 target.date = "2023"; // 修改date属性值无效 console.log(target.date); // 2022
[[Enumerable]]
:
表示该属性是否可以使用for-in返回。所有直接定义在对象上的属性,该特性默认为true。Object.defineProperty(target, "name", { enumerable: false, // 不允许枚举name value:"yyc" }); for (const pro in target){ console.log(pro); // 不会打印name }
[[Writable]]
:
表示该属性的值是否可以被修改。所有直接定义在对象上的属性,该特性默认为true。Object.defineProperty(target, "bar", { writable: false, // 不允许枚举name value:"foo" }); target.bar = "baz"; // 修改无效 console.log(target.bar); // baz
[[Value]]
:
存放实际的属性值。这个特性的默认值为undefined。Object.defineProperty(target, "val", { value:"foo" }); console.log(target.val); // foo
2、访问器属性(setter,getter)
-
[[Configurable]]
:
表示属性是否可以使用delete删除并重新定义,是否可以修改它的特性,以及是否可以把它修改为访问器属性。所有直接定义在对象上的属性,该特性默认为true。 -
[[Enumerable]]
:
表示该属性是否可以使用for-in返回。所有直接定义在对象上的属性,该特性默认为true。 -
[[Get]]
:
获取函数,在读取属性时调用,默认值为undefined。const target = { _date:null }; Object.defineProperty(target, "date",{ set(val){ this._date = val; console.log("set property") } }); target.date = "2022" ; // set property console.log(target._date); // 2022
-
[[Set]]
:
设置函数,在设置函数时调用,默认值为undefined。Object.defineProperty(target, "date",{ get(){ console.log(`get property value: ${this._date}`) return this._date; } }); target.date; // get property value: 2022
3、Object的方法、对象解构赋值
Object.defineProperty()
:
1.该方法用于修改对象属性,它接收三个参数,依次是目标对象,要定义或修改的对象属性,一个描述对象。
2.在调用该方法时,如果configurable,writable,enumerable不指定则默认为false。Object.defineProperties()
:
该方法与defineProperty类似,但是它可以同时定义多个属性,它接收两个参数,依次为目标对象、要设置的属性描述对象。const book = {}; Object.defineProperties(book,{ title:{ value:"《JavaScript高级程序设计》", enumerable:true }, edition:{ value:4.0, enumerable:true }, __year__:{ value:"2022/6/2", enumerable:false }, year:{ enumerable:true, configurable:true, get(){ console.log("get property year"); return this.__year__; }, set(val){ console.log("set property year"); this.__year__ = val; } } });
Object.getOwnPropertyDescriptor()、Object.getOwnPropertyDescriptors()
:
上述方法可以获取指定属性(前一个方法)或多个属性(后一个方法)的属性描述符,返回值是一个对象。const yearDescriptor = Object.getOwnPropertyDescriptor(book, "year"); const bookDescriptors = Object.getOwnPropertyDescriptors(book); console.log(yearDescriptor); console.log(bookDescriptors);
Object.assign()
:
1.该方法可以合并对象,它接收两个及以上参数,依次是目标对象,一个或多个源对象。返回值是目标对象
2.该方法会将源对象中的可枚举属性
和自有属性
复制到目标对象
3.该方法实际上是对每个源对象执行的浅复制
。
4.如果源对象有相同的属性,则使用最后一个复制对象的属性值let dest = {}, src1 = {id:"src", b:'bar',obj:{}}, src2 = {id:"src2",a:"foor"}, result = null; result = Object.assign(dest, src1, src2); console.log(result === dest); //true console.log(src1 !== dest); //true console.log(dest.obj.date); // undefined src1.obj.date = "2022"; console.log(dest.obj.date); // 2022
Object.is()
:
判定两个值是否相等,返回值为布尔值。console.log(Object.is(NaN, NaN));// true // 0.1+0.2 = 0.30000000000000004 console.log(Object.is(0.1+0.2, 0.3));// false,
对象解构
://对象解构 const obj = { name:"Liming", gender:"男" } let nameValue, genderValue; //解构赋值 ({name:nameValue, gender:genderValue} = obj); console.log(nameValue, genderValue); // Liming 男