object.create(proto, propertiesObject)
object.create()
是使用指定的原型proto
對(duì)象及其屬性propertiesObject
去創(chuàng)建一個(gè)新的對(duì)象。(mdn)
-
proto
是必填參數(shù)凿将,就是新創(chuàng)建出來(lái)的對(duì)象的原型 (新對(duì)象的__proto__
屬性指向的對(duì)象)皮服,值得注意的是當(dāng)proto
為null
的時(shí)候創(chuàng)建的新對(duì)象完全是一個(gè)空對(duì)象催烘,沒(méi)有原型(圖一)音诈,也就是沒(méi)有繼承Object.prototype
上的方法扬舒。(如hasOwnProperty()
toString()
等) -
propertiesObject
是可選參數(shù)雏赦,作用就是給新對(duì)象添加新屬性以及描述器(圖2)聋涨,具體可參考 Object.defineProperties() - mdn 的第二個(gè)參數(shù)。需要注意的是新添加的屬性是新對(duì)象自身具有的屬性也就是通過(guò)hasOwnProperty()
方法可以獲取到的屬性溉躲,而不是添加在原型對(duì)象里榜田。(圖3)
具體三個(gè)步驟就是:
- 創(chuàng)建一個(gè)對(duì)象
- 繼承指定父對(duì)象
- 為新對(duì)象擴(kuò)展新屬性
自己實(shí)現(xiàn)一個(gè)Object.create()
:
Object.myCreate = function (obj, properties) {
var F = function () {}
F.prototype = obj
if (properties) {
Object.defineProperties(F, properties)
}
return new F()
}
Object.myCreate({}, {a: {value: 1}}) // {a: 1}
new Object()
-
new
運(yùn)算符是創(chuàng)建一個(gè)自定義對(duì)象或者具有構(gòu)造函數(shù)的內(nèi)置對(duì)象的實(shí)例mdn - 使用
new
運(yùn)算符會(huì)創(chuàng)建一個(gè)新的對(duì)象,它繼承自構(gòu)造函數(shù)的prototype
,也就是說(shuō)它的__proto__
屬性會(huì)指向構(gòu)造函數(shù)的prototype
-
new Object()
也就是具有構(gòu)造函數(shù)的內(nèi)置Object的實(shí)例签财,新創(chuàng)建的對(duì)象的__proto__
屬性會(huì)指向Object的prototype
擴(kuò)展:實(shí)例復(fù)現(xiàn)new的構(gòu)造過(guò)程:
var objectFactory = function () {
var obj = new Object() // 從Object.prototype上克隆一個(gè)空對(duì)象 此時(shí) __proto__ 指向Object.prototype
var Constructor = [].shift.call(arguments) //取得構(gòu)造器
obj.__proto__ = Constructor.prototype // 指向構(gòu)造器的prototype
var ret = Constructor.apply(obj, arguments)
return typeof ret === 'object' ? ret : obj
}
function Person (name) {
this.name = name
}
Person.prototype.getName = function () {
return this.name
}
var a = objectFactory(Person, 'nancy')
console.log(a.name) // nancy
console.log(a.getName) //nancy
console.log(Object.getPrototypeOf(a) === Person.protoType) //true
總結(jié)區(qū)別
-
Object.cerate()
必須接收一個(gè)對(duì)象參數(shù)串慰,創(chuàng)建的新對(duì)象的原型指向接收的參數(shù)對(duì)象偏塞,new Object() 創(chuàng)建的新對(duì)象的原型指向的是 Object.prototype. (表述有點(diǎn)啰嗦唱蒸,簡(jiǎn)潔點(diǎn)說(shuō)就是前者繼承指定對(duì)象, 后者繼承內(nèi)置對(duì)象Object) - 可以通過(guò)
Object.create(null)
創(chuàng)建一個(gè)干凈的對(duì)象灸叼,也就是沒(méi)有原型神汹,而new Object()
創(chuàng)建的對(duì)象是 Object的實(shí)例,原型永遠(yuǎn)指向Object.prototype
.