1,Object.keys()
keys方法遍历可枚举的属性,只包括对象自身可枚举的属性,不包括对象原型链上的可枚举属性。
返回值为一个数组。
let arr = ["a", "b", "c"]; //["0", "1", "2"]
let obj = { foo: "bar", baz: "baz" }; //["foo", "baz"]
2,Object.values()
values方法遍历可枚举的属性值,只包括对象自身可枚举的属性值,不包括对象原型链上的可枚举的属性值。
返回值为一个数组。
let arr = ["a", "b", "c"]; //["a", "b", "c"]
let obj = { foo: "bar", baz: "baz" }; //["bar", "baz"]
3,Object.assign(target, source1, source2, source3)
assign方法用于对象的合并,将源对象的所有可枚举属性拷贝到目标对象,但是只拷贝源对象自身的属性,不拷贝源对象原型链上的属性,也不拷贝不可枚举的属性。
const target = { a: 1, b: 1 };
const source1 = { b: 2, c: 2 };
const source2 = { c: 3 };
Object.assign(target, source1, source2); // {a:1, b:2, c:3}
如果传递多个源对象,每个源对象里有重复的key,最后一个对象会覆盖前面的对象。
如果传递的源对象是undefined或者null,该方法返回目标对象,因为null是一个空对象。至于传递一个undefined为什么也会返回目标对象,我猜测assign方法内部应该是把undefined也当作null空对象处理了。
let obj = {a: 1};
Object.assign(obj, undefined) //{a: 1}
Object.assign(obj, null) //{a: 1}
需要特别注意的是,Object.assign方法只能实现浅拷贝。
const obj1 = {a: {b: 1}};
const obj2 = Object.assign({}, obj1);
obj1.a.b = 2;
console.log(obj2.a.b) //2
obj2.a.b = 3;
console.log(obj1.a.b) //3
4,Obejct.getPrototypeOf()
getPrototypeOf获取指定对象的原型(对象内部属性[[prototype]]的属性值)。
const proto = {};
const object = Object.create(proto);
console.log(Object.getPrototypeOf(object) === proto); // true
需要注意的是,Object的原型不是Object.prototype,而是Function.prototype,因为Obejct是Function实例。
Object.getPrototypeOf(Object) 不是 Object.prototype
Object.getPrototypeOf(Object) === Function.prototype; // true
[[prototype]]这种两个中括号包裹起来的属性,其实是js的内部属性,是无法直接访问的,但是一些浏览器实现了一部分内部属性,比如chrome和firefox在实现层面用了__proto__来表示对象的原型,所以__proto__和[[prototype]]是等价的。
5,Obejct.setPrototypeOf()
setPrototypeOf设置指定对象的原型,传两个参数,第一个为指定的对象,第二个为要指定的原型。
const obj = {a: 1}, proto = {b: 2}
Object.setPrototypeOf(obj, proto)
obj.__proto__ === proto //true
6,Obejct.getOwnPropertyNames()
getOwnPropertyNames与keys相似,但是该方法可以遍历出自身对象上的不可枚举属性,原型链上的可枚举属性和不可枚举属性无法遍历。
var obj = Object.create({}, {
foo: {
value: function() { return this.a; },
enumerable: false
}
});
obj.a = 1;
Object.getOwnPropertyNames(obj).sort() // ["foo", 1]
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!