Object 方法集

列举一下常用的 Object 方法。

1. Object.create

语法如下,接受 2 个参数

Object.create(object, [propertiesObject]);

创建一个新对象,使用传入的第 1 个参数来作为新创建对象的 __proto__

第 2 个参数是 json 对象,key 是对象属性名,value 是描述符

描述符与 Object.defineProperty 一致

var obj = {
color: 'red',
print: function() {
console.log(this.color);
}
};
var son1 = Object.create(obj);
son1.print(); // red
var son2 = Object.create(obj, {
color: {
writable: false,
configurable:true,
value: 'blue'
}
});

Object.create(null)

Object.create(null) 创建的对象,原型指向 null,则不是 Object 的实例,不能使用 Object 上的方法。

2. Object.defineProperty

直接在一个对象上定义或者修改一个属性值或者描述符,并返回此对象。

主要用于修改 Symbol 和描述符,这里详细介绍下描述符:

描述符分两类:

  1. 数据描述符:value,writable
  2. 存取描述符:getter,setter

1. configurable

描述符是否可改变,属性是否可删除。默认为 false。

2. enumerable

是否可枚举,为 true 时会被 for...inObject.keys 遍历。默认为 false。

3. writable

value 值是否可修改。默认为 false。

4. value

该属性对应的值。默认为 undefined。

5. get

属性的 getter 函数,如果没有 getter,则为 undefined。

6. set

属性的 setter 函数,参数为修改的值,如果没有 setter,则为 undefined。

Object.defineProperty(obj, 'name', {
get: function () {
// 使用 obj.name
},
set: function (val) {
// 设置 obj.name
},
});

3. Object.defineProperties

与 Object.defineProperty 一样,只是传参方式不同,还用上面的例子:

Object.defineProperties(obj, {
name: {
get: function () {
// 使用 obj.name
},
set: function (val) {
// 设置 obj.name
},
},
});

4. Object.assign

将一个或多个源对象的可枚举属性分配到目标对象,并返回目标对象

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }

5. Object.entries

返回一个对象自身可枚举属性的键值对数组

const object1 = {
a: 'somestring',
b: 42,
};
for (const [key, value] of Object.entries(object1)) {
console.log(`${key}: ${value}`);
}

和这个同一类的还有 Object.keysObject.values

const object1 = {
a: 'somestring',
b: 42,
};
Object.keys(object1); // ['a', 'b']
Object.values(object1); // ['somestring', 42]

6. Object.freeze

冻结一个对象。被冻结的对象再也不能修改任何属性和描述符。

const obj = {
prop: 42,
};
Object.freeze(obj);
obj.prop = 33;
// Throws an error in strict mode
console.log(obj.prop);
// expected output: 42

7. Object.is

判断两个值是否相等。

与 == 不同,不会强制转换类型。

与 === 也不同,区别如下:

  1. -0 != +0
  2. NaN == NaN

Polyfill

if (!Object.is) {
Object.is = function (x, y) {
// SameValue algorithm
if (x === y) {
// +0 != -0
return x !== 0 || 1 / x === 1 / y;
} else {
// NaN == NaN
return x !== x && y !== y;
}
};
}

8. Object.prototype.hasOwnProperty

判断属性是否在当前对象本身

const object1 = {};
object1.property1 = 42;
console.log(object1.hasOwnProperty('property1'));
// expected output: true
console.log(object1.hasOwnProperty('toString'));
// expected output: false