对象方法统计

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};


  var obj = {a:1,b:2};
    var obj2 = {c:3,d:4};
  
  
   let cloe = Object.assign(
        Object.create(Object.getPrototypeOf(obj)),
        obj
    )

 这里说一下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.valuesObject.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
原文地址:https://www.cnblogs.com/chenyudi/p/12963774.html