js学习日记-new Object和Object.create到底干了啥
var car =new Car(); var car2 = Object.create(Car);
new XXX()時(shí)發(fā)生了什么?
var obj={}; obj.__proto=Car.prototype Car.call(obj)第一步,創(chuàng)建了一個(gè)空對(duì)象obj
第二步,將空對(duì)象的__proto__成員指向了Car函數(shù)的原型屬性,該原型屬性是一個(gè)原型對(duì)象,也就意味著obj的原型屬性上擁有了Car.prototype中的屬性或方法
第三步,將Car函數(shù)中的this指針指向obj,obj有了Car構(gòu)造函數(shù)中的屬性或方法 ,然后Car函數(shù)無返回值或返回的不是對(duì)象,直接返回obj,否則返回Car函數(shù)中的對(duì)象
?
tip:__proto__是什么
每個(gè)對(duì)象都有一個(gè)[[prototype]}屬性,這個(gè)屬性是隱藏屬性,誰創(chuàng)建了它,該屬性就指向誰的prototype屬性,因?yàn)槭请[藏屬性,不能直接訪問,所以有的瀏覽器提供了一個(gè)__proto__屬性來訪問,然而這不是一個(gè)標(biāo)準(zhǔn)的訪問方法,所以ES5中用Object.getPrototypeOf函數(shù)獲得一個(gè)對(duì)象的[[prototype]]。ES6中,使用Object.setPrototypeOf可以直接修改一個(gè)對(duì)象的[[prototype]]
Object.create時(shí)發(fā)生了什么?
Object.create()方法創(chuàng)建一個(gè)新對(duì)象,并使用現(xiàn)有的對(duì)象來提供新創(chuàng)建的對(duì)象的__proto__,關(guān)鍵代碼如下
關(guān)鍵代碼如下:
Object.create = function (o) {var F = function () {};F.prototype = o;var newObj=new F();return newObj; };可以看到Object.create內(nèi)部創(chuàng)建了一個(gè)新對(duì)象newObj,默認(rèn)情況下newObj.__proto__== F.prototype,在本例中則重寫了構(gòu)造函數(shù)F的原型屬性,最終的原型關(guān)系鏈為newObj.__proto__== F.prototype == o
如果現(xiàn)有的對(duì)象是一個(gè)構(gòu)造函數(shù),即var car2=Object.create(Car)會(huì)發(fā)生什么呢?
console.log(car2.color) //undefined console.log(car2.sayHi()) //undefined執(zhí)行代碼發(fā)現(xiàn)都是undefined,?為什么會(huì)這樣呢?
問題1:因?yàn)镺bject.create內(nèi)部的新對(duì)象是new F()創(chuàng)建的,跟Car構(gòu)造函數(shù)沒有半毛錢的關(guān)系,所以自然不能訪問到Car中的屬性了
問題2:調(diào)用car2.sayHi()時(shí)首先判斷car2對(duì)象有沒有相應(yīng)的方法,如果沒有,則查找car2的原型鏈上有沒有該方法,car2的原型屬性是Car構(gòu)造函數(shù)(可以通過car2.__proto__來證明),構(gòu)造函數(shù)沒有sayHi方法,自然也就是undefined了。
那如果將var car2=Object.create(car)又發(fā)生了什么呢?
function Car () {this.color = "red";this.person={name:'張三'} } Car.prototype.sayHi=function(){console.log('你好') } var car =new Car(); var car2 = Object.create(car); car2.person.name ='李四' console.log(`car是${car.person.name},car2是${car2.person.name}`)相當(dāng)于實(shí)現(xiàn)了原型繼承方式(注意不是原型鏈繼承),本質(zhì)上來說是對(duì)一個(gè)對(duì)象進(jìn)行了淺拷貝??
最終結(jié)論:
1.?Object.create(o),如果o是一個(gè)構(gòu)造函數(shù),則采用這種方法來創(chuàng)建對(duì)像沒有意義
2.Object.create(o),如果o是一個(gè)字面量對(duì)象或?qū)嵗龑?duì)象,那么相當(dāng)于是實(shí)現(xiàn)了對(duì)象的淺拷貝
轉(zhuǎn)載于:https://www.cnblogs.com/94pm/p/9113434.html
總結(jié)
以上是生活随笔為你收集整理的js学习日记-new Object和Object.create到底干了啥的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 022-红黑树(三)
- 下一篇: UML 类图总结