Object 方法总结

213 阅读5分钟

1.Object.create(proto[, propertiesObject])

创建一个新对象。
返回一个新对象,带着指定的原型和属性。

// 第一个参数
function Person () {}
const obj = Object.create(new Person());
console.log(obj.constructor)  //[Function: Person]

// 第二个参数
const obj = Object.create({}, {
  a: {
    value: 88,          //默认undefined
    writable: true,     //默认false
    enumerable: true,   //默认false
    configurable: true  //默认false
  }
});

2.Object.defineProperty(obj, prop, descriptor)

直接在一个对象上定义一个新属性,或者修改一个对象的现有属性。

const obj = {a: 1};
Object.defineProperty(obj, 'c', {
  value: 99,          //默认undefined
  writable: true,     //默认false
  enumerable: true,   //默认false
  configurable: true  //默认false
})

let e = 2;
Object.defineProperty(obj, 'e', {
  get() {
    return e;
  },
  set(val) {
    e = e * val;
  }
})
console.log(Object.getOwnPropertyDescriptor(obj, 'e'))
// { 
//   get: [Function: get],
//   set: [Function: set],
//   enumerable: false,
//   configurable: false 
// }
obj.e = 9;
console.log(obj.e)  //18

3.Object.defineProperties(obj, props)

定义一组属性。

var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
  // ...
});

4.Object.getPrototypeOf(object)

返回指定对象的原型。

var proto = {};
var obj = Object.create(proto);
console.log(Object.getPrototypeOf(obj) === proto); // true

5.Object.assign(target, ...sources)

将所有可枚举、非继承属性的值从一个或多个源对象复制到目标对象。

let obj1 = {a: 1, b: {c: 2}};
let obj2 = Object.assign({}, obj1);
obj2.a = 88;
obj2.b.c = 88;
//浅拷贝
console.log(obj1, obj2)  //{ a: 1, b: { c: 88 } } { a: 88, b: { c: 88 } }

6.Object.keys(obj)

返回一个由一个给定对象的自身可枚举属性组成的数组。

var myObj = Object.create({}, {
  getFoo: {
    value: function () { return this.foo; }
  } 
});
myObj.foo = 1;
myObj[Symbol('test')] = 999;
//getFoo 不可枚举
//Symbol 无法获取
console.log(Object.keys(myObj)); // ['foo']

7.Object.values(obj)

返回一个给定对象自身的所有可枚举属性值的数组。

var obj = { foo: 'bar', baz: 42, [Symbol('test')]: 'test' };
Object.defineProperty(obj, 'test', {value: 123})
console.log(Object.values(obj));  // [ 'bar', 42 ]

8.Object.entries(obj)

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

var obj = { foo: "bar", baz: 42, [Symbol('test')]: 'test' }; 
Object.defineProperty(obj, 'test', {value: 123})
var map = new Map(Object.entries(obj));
console.log(Object.entries(obj), map);
// [ [ 'foo', 'bar' ], [ 'baz', 42 ] ] 
// Map { 'foo' => 'bar', 'baz' => 42 }

9.Object.fromEntries(iterable)

把键值对列表转换为一个对象。
Object.entries 的反转。

const map = new Map([ ['foo', 'bar'], ['baz', 42] ]);
const obj = Object.fromEntries(map);
console.log(obj); // { foo: "bar", baz: 42 }

10.Object.is(value1, value2)

判断两个值是否是相同的值。

console.log(Object.is(NaN, NaN))
//true
console.log(Object.is(+0, -0))
//false
console.log(Object.is(0, +0))
//true
console.log(Object.is(NaN, 0/0))
//true
console.log(Object.is({}, {}))
//false
const obj = {
    a: 12
}
const objCopy = Object.assign(obj, {})
console.log(Object.is(obj, objCopy))
//true

11.Object.getOwnPropertyNames(obj)

返回一个由指定对象的所有自身属性的属性名组成的数组。
包括不可枚举属性但不包括Symbol值作为名称的属性。

const arr = [1, 2, 3];
console.log(Object.getOwnPropertyNames(arr));
// [ '0', '1', '2', 'length' ]
const obj1 = { a: 123 };
Object.defineProperty(obj1, 'b', { value: 22 })
console.log(Object.getOwnPropertyNames(obj1));
// [ 'a', 'b' ]

12.Object.getOwnPropertySymbols(obj)

返回一个给定对象自身的所有 Symbol 属性的数组。

const s = Symbol('abc');
const obj = {
    a: 12,
    [Symbol()]: 99,
    [s]: 'abc',
    s: 's',
    [Symbol()]: 88
}
console.log(Object.getOwnPropertySymbols(obj));
// [ Symbol(), Symbol(abc), Symbol() ]

13.Object.getOwnPropertyDescriptor(obj, prop)

返回给定对象上一个自有属性对应的属性描述符。

o = { bar: 42 };
console.log(Object.getOwnPropertyDescriptor(o, "bar"));
// { 
//     value: 42, 
//     writable: true, 
//     enumerable: true, 
//     configurable: true
// }

14.Object.getOwnPropertyDescriptors(obj)

获取一个对象的所有自身属性的描述符。

const obj = {
    a: 123,
    get foo() {
        return this.a
    }
};
console.log(Object.getOwnPropertyDescriptors(obj));
// {
//     a: { value: 123, writable: true, enumerable: true, configurable: true },
//     foo: {
//       get: [Function: get foo],
//       set: undefined,
//       enumerable: true,
//       configurable: true
//     }
// }

15.Object.freeze(obj) && Object.isFrozen(obj)

冻结一个对象。
被冻结对象自身的所有属性都不可能以任何方式被修改。

const obj = {
  a: 12,
  b: { c: 666 },
  getVal: () => {}
};
console.log(Object.isFrozen(obj));  //false
Object.freeze(obj);
console.log(Object.isFrozen(obj));  //true
obj.a = 'hahahah';
obj.b.c = 888;  //浅冻结
console.log(obj);
// { a: 12, b: { c: 888 }, getVal: [Function: getVal] }

16.Object.seal(obj) && Object.isSealed(obj)

封闭一个对象。
阻止添加新属性并将所有现有属性标记为不可配置。

var obj = {a: 123};
Object.seal(obj);
console.log(Object.isSealed(obj)); // === true
console.log(Object.isExtensible(obj)); // === false

obj.a = 999;
console.log(obj); //{ a: 999 }
obj.b = 11;
//silently doesn't add the property
console.log(obj); //{ a: 999 }

17.Object.preventExtensions(obj) && Object.isExtensible(obj)

让一个对象变的不可扩展。

var obj = {};
Object.preventExtensions(obj);
console.log(Object.isExtensible(obj)) // false

冻结 > 密封 > 不可扩展

18.Object.setPrototypeOf(obj, prototype)

设置一个指定的对象的原型到另一个对象或null。
更改对象原型 (prototyoe) 会带来性能问题。谨慎使用。

function Super () {}
var obj = new Super();
console.log(Object.getPrototypeOf(obj));  //Super {}
Object.setPrototypeOf(obj, null);
console.log(Object.getPrototypeOf(obj));  //null

19.Object.prototype.toString()

返回一个表示该对象的字符串。
juejin.cn/post/684490…

20.Object.prototype.valueOf()

返回指定对象的原始值。
juejin.cn/post/684490…

21.Object.prototype.toLocaleString()

返回一个该对象的字符串表示。

var arr = [1, 2, 3]
console.log(arr.toLocaleString()) //1,2,3
var num = 123;
console.log(num.toLocaleString()) //'123'
var date = new Date();
console.log(date.toLocaleString())  //2020-3-16 18:49:04

22.Object.prototype.hasOwnProperty(prop)

用来判断某个对象是否含有指定的属性。

var obj = new Object();
obj.probjp = 'exists';
console.log(obj.hasOwnProperty('prop'))               //true
console.log(obj.hasOwnProperty('toString'));         // false
console.log(obj.hasOwnProperty('hasOwnProperty'));   // false
//和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
console.log('toString' in obj); //true

23.Object.prototype.isPrototypeOf(object)

表示调用对象是否在另一个对象的原型链上。

function Foo() {}
function Bar() {}
function Baz() {}
Bar.prototype = Object.create(Foo.prototype);
Baz.prototype = Object.create(Bar.prototype);

var baz = new Baz();

console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Foo.prototype.isPrototypeOf(baz)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true

24.Object.prototype.propertyIsEnumerable(prop)

指定的属性是否可枚举。

var obj = {a: 123};
Object.defineProperties(obj, {
  c: {
    value: 111
  },
  d: {
    value: 122,
    enumerable: true
  }
})
console.log(obj.propertyIsEnumerable('a')); //true
console.log(obj.propertyIsEnumerable('b'));  //false
console.log(obj.propertyIsEnumerable('c'));  //false
console.log(obj.propertyIsEnumerable('d'));  //true

25.Reflect

  • Reflect.has(obj, name) 对应name in obj里面的in运算符。
var myObject = {
  foo: 1,
};
// 旧写法
'foo' in myObject // true
// 新写法
Reflect.has(myObject, 'foo') // true
  • Reflect.deleteProperty(obj, name) 等同于delete obj[name]
const myObj = { foo: 'bar' };
// 旧写法
delete myObj.foo;
// 新写法
Reflect.deleteProperty(myObj, 'foo');
  • Reflect.construct(target, args) 等同于new target(...args)
function Greeting(name) {
  this.name = name;
}
// new 的写法
const instance = new Greeting('张三');
// Reflect.construct 的写法
const instance = Reflect.construct(Greeting, ['张三']);
  • Reflect.getPrototypeOf(obj) 对应Object.getPrototypeOf
  • Reflect.setPrototypeOf(obj, newProto) 对应bject.setPrototypeOf
  • Reflect.defineProperty(target, propertyKey, attributes) 对应Object.defineProperty
  • Reflect.getOwnPropertyDescriptor(target, propertyKey) 对应Object.getOwnPropertyDescriptor
  • Reflect.isExtensible(target) 对应Object.isExtensible
  • Reflect.preventExtensions(target) 对应Object.preventExtensions
  • Reflect.ownKeys(target) 等同于Object.getOwnPropertyNames与Object.getOwnPropertySymbols之和

参考文献
developer.mozilla.org/zh-CN/docs/…