学习笔记7--js面向对象
对象是无序属性的集合
属性类型
创建属性Object.defineProperty()
如果对象中不存在指定的属性,Object.defineProperty()就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是false。value,get和set字段的默认值为undefined。一个没有get/set/value/writable定义的属性被称为“通用的”,并被“键入”为一个数据描述符。
数据属性
和访问器属性
数据属性
[[
Configurable
]]表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属。直接在对象上定义的属性,默认值true
。
[[Writeble
]]默认值true
[[Enumerable
]]表示能否通过for-in循环返回属性。直接在对象上定义的属性,默认值true
。
[[Writable
]]表示能否修改属性的值,直接在对象上定义的属性,默认值true
。
[[Value
]]包含这个属性的数据值\
要修改属性默认的特性,必须使用Object.defineProperty()方法。这个方法接受三个参数:属性所在的对象,属性的名字,描述符对象(必须是configurable,enumerable,writable和value)。
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
//Nicholas
console.log(person.name);
//非严格模式,赋值被忽略,严格模式下,赋值操作拋错
person.name = "xiaohong";
//Nicholas
console.log(person.name);
一旦将configurable设置为false,表示不能从对象中删除属性,不能再把configurable设置为true。修改除writable之外的特性都会导致错误。
Object.defineProperty(person, "name", { configurable: false, value: "Nicholas" });
Object.defineProperty(person, "name", { value: "haha" });
访问器属性
访问器属性不包含数据值;包含一对getter和setter函数。在读取对象的某个属性时,会调用这个属性的getter函数。在修改对象的某个属性时,会调用这个属性的setter函数。
访问器属性有如下4个特性:
[[Configurable
]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。
[[Enumerable
]]:表示能否通过 for-in 循环返回属性。
[[Get
]]:在读取属性时调用的函数。默认值为 undefined。
[[Set
]]:在写入属性时调用的函数。默认值为 undefined。访问器属性不能直接定义,必须使用 Object.defineProperty() 来定义。
访问器属性常用于:设置一个属性值导致另一个属性值的变化。
只指定getter,属性不能写,在非严格模式下赋值会被忽略,严格模式下回拋错。
只指定setter,属性不能写,在非严格模式下返回undefined,严格模式下回拋错。
Object.defineProperty()
定义多个属性
Object.getOwnPropertyDescriptor()
接收两个参数: 1 属性所在的对象, 2 要读取的描述符的属性名称
返回: 一个对象
如果是数据属性,这个对象有属性有,configurable, enumerable,writable,value
如果是访问器属性,这个对象有属性有,configurable, enumerable,get,set
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");
console.log(descriptor.value);//2004
console.log(descriptor.configurable);//false
console.log(descriptor.get);//undefined
//读取访问属性
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor.value);//undefined
console.log(descriptor.configurable);//false
console.log(typeof descriptor.get);//function
console.log(descriptor.enumerable);//false