主页
主页
文章目录
  1. 对象和原型
    1. 对象
    2. 属性描述符
      1. <1> [[writable]]
      2. <2> [[configurable]] 默认值true
      3. <3> [[value]] 默认值undefined
      4. <4> [[enumerable]] 默认值true
    3. 访问描述符
      1. [[get]] [[set]]
    4. 不变性
      1. <1> 设置writable、configurable为false
      2. <2> Object.preventExtensions() 不可扩展
      3. <3> Object.seal() 密封
      4. <4> Object.freeze() 冻结
    5. 存在性
      1. hasOwnProperty()

javascript基础-js对象

对象和原型

对象

若干属性的集合就是对象,一切引用类型都是对象,都是属性的集合

1
2
3
4
let arr = [1,2]
arr.name = 'kimi';
console.log(arr.length) // 2
console.log(arr.name) // 'kimi'

属性描述符

1
2
3
4
5
6
7
8
9
10
let obj = {
a: 2
};
Object.getOwnPropertyDescriptor(obj, 'a');
// {
// value: 2,
// writable: true,
// enumerable: true,
// configurable: true
// }

<1> [[writable]]

表示是否能修改属性的值,默认值是true

1
2
3
4
5
6
7
8
9
let obj = {};
Object.defineProperty(obj, 'a', {
value: 2,
writable: false, // 不可写
configurable: true,
enumerable: true,
})
obj.a = 3; // 严格模式下会报错,非严格模式下会忽略
obj.a // 2

<2> [[configurable]] 默认值true

是否可以通过defineProperty来配置对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let obj = {};
Object.defineProperty(obj, 'a', {
value: 2,
writable: true,
configurable: false, // 不可配置
enumerable: true,
})
obj.a = 3; // 仍然可以修改属性值
obj.a // 3

Object.defineProperty(obj, 'a', {
value: 2,
writable: true,
configurable: true, // 不管什么模式都会报错
enumerable: true,
})

如果使用Object.defineProperty创建新属性但是不填写配置,writable、configurable、enumerable默认都是false。

1
2
3
4
5
6
7
8
9
let obj = {};
Object.defineProperty(obj, 'a', {})
Object.getOwnPropertyDescriptor(obj, 'a');
// {
// value: undefined,
// writable: false,
// enumerable: false,
// configurable: false
// }

如果设置了configurable是false。仍然可以将writable的值从true设置为false,但是不可以从false设置为true。
如果设置了configurable是false,不可以使用delete删除属性

<3> [[value]] 默认值undefined

包含这个属性的数据值

<4> [[enumerable]] 默认值true

是否可以for in、object.keys、 JSON.stringify递归出来

访问描述符

[[get]] [[set]]

1
2
3
4
5
6
7
8
9
let obj = {};
Object.defineProperty(obj, 'a', {
get: function() {
return this._a;
},
set: function(val) {
this._a = val;
}
})
1
2
3
4
5
6
7
8
let obj = {
get a() {
return this._a;
},
set a(val) {
this._a = val
}
}

以上两种都会在对象中创建一个不包含值的属性,自动调用get、set函数。如果设置了set、get则会忽略value和enumerable配置

不变性

<1> 设置writable、configurable为false

设置writable、configurable为false就可以创建一个真正的常量属性,不可修改、重定义、删除

<2> Object.preventExtensions() 不可扩展

1
2
3
4
5
6
let obj = {
a: 2
};
Object.preventExtensions(obj) ; // 不可以添加新属性,并且保留已有属性
obj.b = 3 ;
obj.b // undefined

<3> Object.seal() 密封

会在现有对象身上调用Object.preventExtensions,并把所有属性标记为configurable为false

不能添加新属性,也不能重新配置或者删除现有属性。可以修改现有的值

<4> Object.freeze() 冻结

会在现有对象身上调用Object.seal,并且把所有属性标记为writable为false

不能添加新属性,也不能重新配置或者删除现有属性。不可以修改现有的值

存在性

1
2
3
4
5
6
let obj = {
a: undefined
}
obj.a // undefined
obj.b // undefined
都是undefined,如何来区分哪个为obj的属性呢?

hasOwnProperty()

hasOwnProperty只会判断自身是否有属性。in 操作符会检查属性是否存在原型中。

1
2 in [1,2]  // false 判断的是key 数组的key是下标 0,1
支持一下
扫一扫,支持superkimi
  • 微信扫一扫
  • 支付宝扫一扫