由于现代 JavaScript 引擎优化属性访问所带来的特性的关系,更改对象的 [[Prototype]]即__proto__在各个浏览器和 JavaScript 引擎上都是一个很慢的操作。
一 Object原型方法
1 Object.setPrototypeOf(obj, proto)
- 用该方法而不是直接修改__proto__
- 返回值是设置好原型的obj,即第一个参数
- 若第一个参数不是对象,则该操作没有效果,将第一个参数构造函数的原型作为obj的原型
const n = new Number(1)
console.log(n)
console.log(Object.getPrototypeOf(n))
const obj = Object.setPrototypeOf(1, {
a: 100 })
console.log(obj)
console.log(Object.getPrototypeOf(obj)) // 查看原型是否设置上
- 若第一个参数是undefined/null(没有包装类),则报错
2 Object.getPrototypeOf()
- 当参数是原始值,则返回其包装类构造函数的原型
3 Object.keys()
- 返回可枚举属性,不含继承属性
- for in可以拿到继承的属性
4 Object.values()
- 返回可枚举属性值
5 Object.entries()
const obj = {
a: 1 }
Object.defineProperties(obj, {
b: {
value: 2,
enumerable: true
},
c: {
value: 3
}
})
const p = {
d: 4 }
Object.setPrototypeOf(obj, p)
console.log(obj)
console.log('keys', Object.keys(obj))
console.log('values', Object.values(obj))
console.log('entries'