Object.assign和Object.create的基本用法
阿新 • • 發佈:2020-10-20
let obj = Object.assign(targetObj, …sourceObj)
作用:將一個或多個源物件自身的可列舉屬性與目標物件的屬性合併
返回值:合併後的目標物件
var obj1 = {name: 'zyp1'} var obj2 = {name: 'zyp2', age: 18} var obj3 = {name: 'zyp'} obj3 = Object.defineProperty(obj3, 'like', { value: 'reading' }) var obj4 = {} var obj = Object.assign(obj4, obj1, obj2, obj3) console.log(obj)//結果為{name: "zyp", age: 18} console.log(obj4) //結果也為{name: "zyp", age: 18}
這裡還要提一下的是,用擴充套件運算子也可以實現物件的合併: var obj5 = {...obj1, ...obj2, ...obj3} console.log(obj5) //結果為{name: "zyp", age: 18}
let obj = Object.create(protoObj, [propertiesObj])
作用:建立新物件,在建立新物件的同時定義其原型物件(protoObj)以及一些新的屬性(propertiesObj,新屬性構成的物件,可選)
返回值:建立的新物件
// new Object() 方式建立 var a = { rep : 'apple' } var b = new Object(a) console.log(b) // {rep: "apple"} console.log(b.__proto__) // {} console.log(b.rep) // {rep: "apple"} // Object.create() 方式建立 var a = { rep: 'apple' } var b = Object.create(a) console.log(b) // {} console.log(b.__proto__) // {rep: "apple"} console.log(b.rep) //{rep: "apple"}
function Person(name, age) { this.name = name; this.age = age; } Person.prortotype.sayName = function() { alert(this.name) } function Worker(name, age) { Person.call(this, name, age) } var worker = new Worker('zyp', 18) console.log(worker)
得到的worker物件結果如下圖:
這個符合我們的預期,通過建構函式實現繼承的子類例項不會繼承父類的原型屬性,因此父類的sayName方法並沒有被子類物件繼承。
//子類繼承父類的原型屬性 Worker.prototype = Object.create(Person.prototype) Worker.prototype.constructor = Worker
得到的結果如下: