js基础之--Object.assign和Object.create

557 阅读2分钟

Object.assign(target,...source)

定义

Object.assign()主要是将所有可枚举属性的值从一个或多个源对象复制到目标对象,同时返回目标对象

语法

Object.assign(target, ...sources) 其中 target 是目标对象,sources 是源对象,可以有多个,返回修改后的目标对象 target

如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后来的源对象的属性将类似地覆盖早先的属性。

Object.assign的模拟实现

思路如下:

  1. 判断原生Object中是否存在assign函数,如果不存在, 则创建一个assign, 并使用Object.defineProperty将assign绑定到Object上
  2. 判断参数是否正确(目标对象不能为空)
  3. 使用Object将target转成对象, 并返回target
  4. 使用 for..in 循环遍历出所有可枚举的自有属性。并复制给新的目标对象(hasOwnProperty返回非原型链上的属性)
  if(typeof Object.assign!=='function'){
    Object.defineProperty(Object,'assign',{
      value:function(target){
        if(target===null){
        throw new TypeError('Cannot convert undefined or null to object')
        }
        const target_=Object(target)
        for( let i=1;i<arguments.length;i++){
          const source=arguments[i]
          if(source!==nnull){
            for(let key in source){
              if(Object.prototype.hasOwnProperty(source,key)){
                target_[key]=source[key]
              }  
            }
          }
        }
        return target_
      },
      writable:true,
      configurable:true
    })
  }

Object.create

定义

Object.create()  方法用于创建一个新对象,使用现有的对象来作为新创建对象的原型(prototype)。

语法

Object.create(proto)

Object.create(proto, propertiesObject)

参数

proto 新创建对象的原型对象

propertiesObject 如果propertiesObject参数被指定且不为 [undefined],则该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。这些属性对应于 [Object.defineProperties()] 的第二个参数。

返回值

一个新对象,带着指定的原型对象及其属性。

//create的实现原理
function create(o){
   function F(){}
   F.protoType=o
   f=new F()
   return f
}