這么做國外網(wǎng)站的國內(nèi)鏡像站甘肅搜索引擎網(wǎng)絡(luò)優(yōu)化
<script>//前置知識(shí)// 每一個(gè)函數(shù)在創(chuàng)建之初就會(huì)有一個(gè)prototype屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象// function abc(){// }// abc.prototype--> {constructor: f}// 在JS中任意的對(duì)象都有內(nèi)置的屬性叫做[[prototype]]這是一個(gè)私有屬性,這個(gè)私有屬性通過__proto__的方法來訪問。// 隱式原型指向這個(gè)對(duì)象函數(shù)的顯式原型// function Abc(){// this.name='wn'// }// let test = new Abc()// test.__proto__=Abc.prototype//實(shí)例的隱式原型等于它構(gòu)造函數(shù)的顯式原型function Foo(e) {this.name = 'wn'this.age = e//如果構(gòu)造函數(shù)有個(gè)return,return出來的值會(huì)影響到我們的返回結(jié)果,如果return出來的是個(gè)對(duì)象的話 那我們的作用域會(huì)出現(xiàn)一些微妙的結(jié)果,return不是對(duì)象的話沒什么影響 但是如果是對(duì)象的話return出來的值就會(huì)受到影響 是它本身return {}}//手動(dòng)實(shí)現(xiàn)new操作符function objectFactory() {// 1. 定義一個(gè)對(duì)象出來 console.log(new Foo(18)) new Foo一定是一個(gè)對(duì)象 實(shí)例對(duì)象實(shí)例對(duì)象const obj = {}//3. 構(gòu)造函數(shù)可以接收參數(shù)的,但是要先拿到這個(gè)構(gòu)造函數(shù),shift刪除數(shù)組的第一項(xiàng)并且返回該項(xiàng)值,把shift方法里面的作用域修改到arguments里面去,call方法改變this指向//[].shift.call(arguments) 的目的是將 arguments 對(duì)象轉(zhuǎn)換成數(shù)組,并調(diào)用數(shù)組對(duì)象的 shift 方法來取出第一個(gè)參數(shù)(構(gòu)造函數(shù))。由于 arguments 是類數(shù)組對(duì)象而不是真正的數(shù)組對(duì)象,所以不能直接調(diào)用 shift 方法。因此,我們借助 call 方法來顯式指定調(diào)用 shift 方法時(shí)的上下文對(duì)象,也就是將 shift 方法中的 this 指向 arguments 對(duì)象,從而實(shí)現(xiàn)從 arguments 中取出第一個(gè)參數(shù)的目的。const Constructor = [].shift.call(arguments)//或者是下面這樣的方法,解構(gòu)賦值 ...arguments這里面可能有很多參數(shù) 但是第一個(gè)指定是constructor,這里傳進(jìn)來的參數(shù)其實(shí)是console.log(objectFactory(Foo,18))第一個(gè)傳進(jìn)來的肯定是Foo//const [Constructor, ...args] = [...arguments]//現(xiàn)在拿到了我們的構(gòu)造函數(shù)需要調(diào)用一下,因?yàn)閚ew的時(shí)候的實(shí)例對(duì)象會(huì)繼承函數(shù)的屬性和方法,所以接下來是要實(shí)現(xiàn)要將函數(shù)的屬性或者方法添加到構(gòu)造函數(shù)上去//5. 執(zhí)行我們的原型連接 ,obj.__proto__ = Constructor.prototypeconst ret = Constructor.apply(obj, arguments) //4.要將構(gòu)造函數(shù)的作用域指到我們的obj的空對(duì)象作用域中來,arguements順帶捎上人家的參數(shù)//return obj //2. 返回一個(gè)參數(shù)return typeof ret === 'object' ? ret : obj}console.log(objectFactory(Foo, 18));</script>
運(yùn)行之后如圖(構(gòu)造函數(shù)沒有return的時(shí)候):