Object.assign(target,...source)
定义
Object.assign()主要是将所有可枚举属性的值从一个或多个源对象复制到目标对象,同时返回目标对象
语法
Object.assign(target, ...sources)
其中 target 是目标对象,sources 是源对象,可以有多个,返回修改后的目标对象 target。
如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后来的源对象的属性将类似地覆盖早先的属性。
Object.assign的模拟实现
思路如下:
- 判断原生Object中是否存在assign函数,如果不存在, 则创建一个assign, 并使用Object.defineProperty将assign绑定到Object上
- 判断参数是否正确(目标对象不能为空)
- 使用Object将target转成对象, 并返回target
- 使用
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
}