js中对象的属性类型

简介

在 javaScript 中,对象的属性分为两种类型:数据属性和访问器属性。

数据属性

它包含的是一个数据值的位置,在这可以对数据值进行读写。数据属性包含 4 个特性:

  • configurable:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为 true
  • enumerable:表示能否通过 for-in 循环返回属性
  • writable:表示能否修改属性的值
  • value:包含该属性的数据值。默认为 undefined

查看对应属性的特性

Object.getOwnPropertyDescriptor()函数

Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//定义一个对象
var obj = {
name:'w',
age:18
}

//查看name属性的特性
console.log(Object.getOwnPropertyDescriptor(obj, 'name'))

//结果
{
configurable:true,
enumerable:true,
value:"w",
writable:true
}

修改属性特性

Object.defineProperty()函数

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//修改name属性特性
Object.defineProperty(obj, 'name', {
configurable: false,
enumerable: false,
value: "ww",
writable: false
})

//查看
console.log(Object.getOwnPropertyDescriptor(obj, 'name'))

//结果
{
configurable: false,
enumerable: false,
value: "ww",
writable: false
}

访问器属性

这个属性不包含数据值,包含的是一对 get 和 set 方法,在读写访问器属性时,就是通过这两个方法来进行操作处理的。它也包含 4 个属性特性:

  • configurable:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为 false
  • enumerable:表示能否通过 for-in 循环返回属性,默认为 false
  • get:在读取属性时调用的函数,默认值为 undefined
  • set:在写入属性时调用的函数,默认值为 undefined

注意:访问器属性不能直接定义,要通过 Object.defineProperty()这个方法来定义。

在上面对象上定义 hello 属性,为访问器属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var obj = {
name: 'w',
age: 18
};

//定义hello访问器属性
Object.defineProperty(obj, 'hello', {
get: function () {
console.log('get被触发了')
},
set: function (val) {
console.log('set被触发了,参数是:' + val)
}
})

//console.log(Object.getOwnPropertyDescriptor(obj, 'name'))

console.log(Object.getOwnPropertyDescriptor(obj, 'hello'))

//结果
{
configurable:false,
enumerable:false,
get:ƒ (),
set:ƒ (val)
}

检测 get 和 set(在控制台操作更直观)

1
2
3
4
5
6
7
//赋值
obj.hello = 'hi';
//==> set被触发了,参数是:hi

//查看
obj.hello
//==> get被触发了

可知,set 函数的参数既是所赋的值,赋值即传参