对象方法统计
1、object.is
比较俩个值是不是对等。
Object.is("he","he") //true Object.is({},{}) //fasle
2、object.assign
方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)
var obj = {a:1,b:2}; var obj2 = {c:3,d:4}; let js = Object.assign(obj,obj2); //{a:1,b:2,c:3,d:4} let js = {...obj,...obj2} == let js = Object.assign(obj,obj2);
参数不能为null或者是undefined
Object.assign(null) //报错 Object.assign(undefined) //报错
当我们使用assign去合并对象的时候。原对象也会发生改变
var obj = {a:1,b:2}; var obj2 = {c:3,d:4}; let js = Object.assign(obj,obj2); console.log(js); //{a: 1, b: 2, c: 3, d: 4} console.log(obj); //{a: 1, b: 2, c: 3, d: 4}
Object.assign注意一下几点
1、方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。
2、对于这种嵌套的对象,一旦遇到同名属性,Object.assign
的处理方法是替换,而不是添加。
3、Object.assign
可以用来处理数组,但是会把数组视为对象。
常见用法
(1)为对象添加属性
class Point { constructor(x, y) { Object.assign(this, {x, y}); } }
上面方法通过Object.assign
方法,将x
属性和y
属性添加到Point
类的对象实例。
(2)克隆对象var obj = {a:1,b:2};
这里说一下Object.create 他是创建一个新对象,使用现有的对象的原型,创建新对象。
Object.getPrototypeOf下面会说到(放回当前对象的原型值)
这样就可以把一个对象进行拷贝。但是这还拷贝还不完全,下面会说到一个完全一点的方法。
2、object.getPrototypeOf
方法返回指定对象的原型内部[[Prototype]]
属性的值)
function ps(a,b){ this.a = a; } var de = new ps(3,6) console.log(Object.getPrototypeOf(de)); //{constructor: ƒ}
在构造模式下他获得是构造函数
var d = {a:1} console.log(Object.getPrototypeOf(d)) //{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
在字面量情况下 返回的就是 原型
object.getPrototypeOf == __propo__
3、Object.defineProperties ()
方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
var obj = {}; Object.defineProperties(obj, { 'property1': { value: true, writable: true }, 'property2': { value: 'Hello', writable: false } }); //{property1: true, property2: "Hello"}
上面的内容是把对象obj进行了修改。
4、Object.getOwnPropertyDescriptors()
方法,返回指定对象所有自身属性(非继承属性)的描述对象。
var obj2 = { a:1, he:function(){ return thia.a++ }, } console.log(Object.getOwnPropertyDescriptors(obj2)); //{a: {…}, he: {…}}
次方法可以解决Object.assign无法拷贝get和set的方法
let obj = { set foo(value){ return value } } let obj2 = {} Object.defineProperties(obj2,Object.getOwnPropertyDescriptors(obj)); console.log(Object.getOwnPropertyDescriptors(obj2)); //{foo: {…}} {foo: {…}} foo: configurable: true enumerable: true get: undefined set: ƒ foo(value) __proto__: Object __proto__: Object
上面的内容是拷贝的过程。过程中 Object.defineProperties
修改了obj2的属性方法。属性方法是通过 Object.getOwnPropertyDescriptors 来进行获取,这个方法可以获得对应的属性方法,包括get,和set
这样就实现了正确的拷贝
5、Object.keys(),Object.values(),Object.entries()
Object.keys
配套的Object.values
和Object.entries
,作为遍历一个对象的补充手段,供for...of
循环使用。
var obj = {a:1,b:2,name:"lly",age:20} for(let i of keys(obj)){ console.log(i); } // a b name age for(let z of values(obj)){ console.log(z); } // 1 2 lly 20