属性名表达式
- 方法一:用标识符作为属性名
- obj.foo = true
- 方法二:用表达式作为属性名
- obj[‘a’ + ‘bc’] = 123
- 注意:属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串[object Object]
1
2
3
4
5
6
7
8
9
10
11// 对象字面量
let obj = {
['a' + 'bc']: 123
}
// 定义方法名
let obj = {
['h' + 'ello'](){
return 'hi'
}
}
obj.hello()
函数的name属性,返回函数名。对象方法也是函数
1 | const person = { |
- 如果对象的方法使用了取值函数(getter)和存值函数(setter),则name再该方法的属性的get和set上
1
2
3const desc = Object.getOwnProertyDescriptor(person,'foo')
desc.get.name "get foo"
desc.set.name "set foo" - 特殊情况:
- 1、bind方法创造的函数,name属性返回bound 加上原函数名;Function构造函数创造的函数,返回anonymous
1
2
3(new Function()).name // "anonymous"
var doSomething = function() {}
doSomething.bind().name //"bound doSOmething" - 2、对象方法是一个Symbol值
1
2
3
4
5const key1 = Symbol('description')
let obj = {
[key1]() {}
}
obj[key1].name // 'description'
- 1、bind方法创造的函数,name属性返回bound 加上原函数名;Function构造函数创造的函数,返回anonymous
属性的遍历
for…in
- for…in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
Object.keys(obj)
- Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
Object.getOwnPropertyNames(obj)
- Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
Object.getOwnPropertySymbols(obj)
- Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。
Reflect.ownKeys(obj)
- Reflect.ownKeys返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
遍历顺序
- 首先遍历所有数值键,按照数值升序排列。
- 其次遍历所有字符串键,按照加入时间升序排列。
- 最后遍历所有 Symbol 键,按照加入时间升序排列。
- Reflect.ownKeys({ [Symbol()]:0, b:0, 10:0, 2:0, a:0 }) // [‘2’, ‘10’, ‘b’, ‘a’, Symbol()]
super 指向当前对象的原型对象
1 | const proto = { |
扩展运算符…
1 | let z = { a: 3, b: 4 } |
- 对象的扩展运算符等同于使用Object.assign()方法。
对象的新增方法
Object.is(值1,值2), 判断两个值是否严格相等(===)
- +0不等于-0,NAN等于自身
Object.assign()方法用于对象的合并(浅拷贝)
- 多参:
- Object.assign(复制存放地, 被复制对象, 被复制对象,…);
- 一参:返回该参数
- undefined,null做首参则报错
- 参数非对象,转对象在返回
- 不拷贝enumerable: false
注意
- 浅拷贝:只要修改其中一个,其它的也会改变
1
2
3
4
5
6
7
8const obj1 = {a: {b:1}};
const obj2 = Object.assign({},obj1);
obj1.a.b = 2;
console.log(obj2.a.b)
obj2.a.b = 4;
console.log(obj1.a.b) - 同名属性替换(复制存放的对象属性如果跟被复制的对象属性一样,替换)
- 可以处理数组,但是会把数组视为对象
常见用途
- 为对象添加属性
1
2
3
4
5
6//将x属性和y属性添加到Point类的对象实例
class Point {
constructor(x, y) {
Object.assign(this, {x, y});
}
} - 为对象添加 方法
1
2
3
4
5
6
7//给SomeClass.prototype添加方法
Object.assign(SomeClass.prototype, {
someMethod(arg1, arg2) {
},
anotherMethod() {
}
}); - 克隆对象
1
2
3
4function clone(origin) {
let originProto = Object.getPrototypeOf(origin);
return Object.assign(Object.create(originProto), origin);
} - 合并多个对象
1
const merge = (target, ...sources) => Object.assign(target, ...sources);