无序属性的集合(散列表),其属性能够包含基本值,对象或函数;浏览器
每一个对象都是基于一个引用类型建立的,这个引用类型能够是原生类型,也能够是自定义类型。函数
建立一个Object实例ui
var person = new Object()
person.name = 'Memory'
person.age = 24
person.sayName = function () {
console.log(this.name) // Memory
}
复制代码
对象字面量this
var person = {
name: 'Memory',
age: 24,
sayName: function () {
console.log(this.name) // Memory
}
}
复制代码
其中name
和age
是person的属性,sayName
是person的方法。spa
只有内部才用的特性,在JS中不能直接访问它们,为了表示特性是内部值,把它们放到了[[]]中;设计
ECMAScript中有如下两种属性,数据属性和访问器属性。code
其中,person.name的[Configurable]]、[[Enumerable]]、[[Writable]]都为true,[[Value]]为Memory。cdn
修改数据属性:Object.defineProperty(对象obj
, [属性名称]
, 描述符对象
)对象
其中,描述符对象的属性必须是configurable、enumerable、writable、value以内的一到四个。blog
在调用Object.defineProperty时,若是不指定,configurable、enumerable、writable的值都默认为false
;
在把configurable设为false以前,能够屡次调用Object.defineProperty()修改同一个属性。以后修改除writable
以外的其余特性,都会致使错误;
尝试修改writable:
Object.defineProperty(person, 'name', {
configurable: false,
})
console.log(person.name) // Memory
Object.defineProperty(person, 'name', {
writable: true,
value: 'doublemeng'
})
console.log(person.name) // doublemeng
复制代码
尝试修改configurable:
Object.defineProperty(person, 'name', {
configurable: false,
})
console.log(person.name) // Memory
// Uncaught TypeError: Cannot redefine property: name
Object.defineProperty(person, 'name', {
configurable: true,
value: 'doublemeng'
})
console.log(person.name)
复制代码
configurable设为false,即表示不能从对象中删除属性;
若是这个对象调用delete,非严格模式下会被忽略,严格模式下则会抛错。
writable设为false,即表示该属性不可写;
非严格模式下会被忽略,严格模式下则会抛错。
访问器属性包含getter和setter函数(这两个函数都不是必需的),其中setter用来写值,getter用来读值。
设置一个属性的值会致使其余属性的变化,以下例year
的变化致使_year
和age
的变化:
var book = {
age: 1,
_year: 2000 // 只能经过对象方法访问的属性
}
console.log(book._year) // 2000
console.log(book.age) // 1
Object.defineProperty(book, 'year', {
get: function () {
return this._year
},
set: function (newYear) {
this._year = newYear
this.age = newYear - 2000 + 1
}
})
book.year = 2019
console.log(book._year) // 2019
console.log(book.age) // 20
复制代码
不必定非要指定getter和setter;
只指定getter意味着属性只能读不能写;
尝试写入,在非严格模式下会被忽略,严格模式下则会抛错。
只指定setter意味着属性只能读不能读;
尝试读取,在非严格模式下会返回undefined,严格模式下则会抛错。
在该方法以前,要建立访问器属性通常要使用两个非标准的方法:__defineGetter__()
和 __defineSetter__()
var book = {
age: 1,
_year: 2000 // 只能经过对象方法访问的属性
}
console.log(book._year) // 2000
console.log(book.age) // 1
book.__defineGetter__('year', function () {
return this._year
})
book.__defineSetter__('year', function (newYear) {
this._year = newYear
this.age = newYear - 2000 + 1
})
book.year = 2019
console.log(book._year) // 2019
console.log(book.age) // 20
复制代码
不支持Object.defineProperty()
的浏览器不能修改[Configurable]]
和[[Enumerable]]
Object.defineProperties(对象obj
,对象 其属性为obj要添加和修改的属性
)
Object.getOwnPropertyDescriptor(对象
,属性
)
《JavaScript高级程序设计》
本文主要介绍了对象属性的各类特性。其主要包括数据属性的[[Configurable]]
、[[Enumerable]]
、[[Writable]]
、[[Value]]
和访问器属性的[[Configurable]]
、[[Enumerable]]
、[[Get]]
、[[Set]]
。
若有问题,欢迎指正。