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之和