JavaScript面向?qū)ο缶幊虒?shí)現(xiàn)模擬
前言
每個(gè)對(duì)象都是一個(gè)功能中心,具有明確分工,可以處理信息,處理信息,發(fā)出信息。面向?qū)ο缶幊叹哂徐`活性、可復(fù)用性、模塊化等好處,適合更多合作完成的大型項(xiàng)目。
1. 構(gòu)造函數(shù)
構(gòu)造函數(shù)的功能是生成對(duì)象,生成具有相同結(jié)構(gòu)對(duì)象的函數(shù)。Java語(yǔ)言通過(guò)類實(shí)現(xiàn)面向?qū)ο?對(duì)象是類的實(shí)例,而Javascript則是通過(guò)構(gòu)造函數(shù)作為對(duì)象的模板,使用prototype實(shí)現(xiàn)繼承。
構(gòu)造函數(shù)的幾個(gè)特點(diǎn)
- 構(gòu)造函數(shù)內(nèi)部使用了this關(guān)鍵字作為被生成的對(duì)象
- 構(gòu)造函數(shù)配合new 操作符使用
- 構(gòu)造函數(shù)的第一個(gè)字符一般大寫用來(lái)區(qū)分普通函數(shù)
- 構(gòu)造函數(shù)默認(rèn)返回一個(gè)新對(duì)象(this),如果手動(dòng)返回值是引用數(shù)據(jù)類型會(huì)覆蓋默認(rèn)的返回值
function Person(name ){ this.name = name; }; const jack = new Person('jack'); //Person {name: 'jack'} function Person(name ){ this.name = name; return name; }; const jack = new Person('jack'); //Person {name: 'jack'} function Person(name ){ this.name = name; return ['jack']; }; const jack = new Person('jack'); //['jack']
2. new的過(guò)程
- 生成一個(gè)新對(duì)象綁定給this
- 將新對(duì)象的原型設(shè)置為構(gòu)造函數(shù)的prototype屬性
- 執(zhí)行代碼,往this上添加屬性
- 返回this
2.1 基礎(chǔ)使用
function Person(name ){ this.name = name; }; const jack = new Person('jack'); const tom = new Person('tom'); console.log(jack); //Person {name: 'jack'} console.log(tom); //Person {name: 'tom'}
直接執(zhí)行構(gòu)造函數(shù)會(huì)怎么樣?
function Person(){ this.name = name; }; const jack = Person('jack'); //undefined
構(gòu)造函數(shù)的this指向了window,并沒(méi)有返回一個(gè)對(duì)象,我們現(xiàn)在做以下兼容:
function Person(name){ if(!(this instanceof Person)){ return new Person(name); }; this.name = name; };
現(xiàn)在可以直接使用了
Person(name); //Object { name: "jack" }
2.2 new.target
在函數(shù)內(nèi)部都可以使用new.target,如果函數(shù)是通過(guò)new.target調(diào)用的則返回被調(diào)用的構(gòu)造函數(shù)否則返回undefined
function Person(){ console.log(new.target); }; new Person(); //function Person(){...} Person(); //undefined
現(xiàn)在使用new.target進(jìn)行構(gòu)造函數(shù)的兼容
function Person(name){ if(!(new.target === Person)){ return new Person(name); }; this.name = name; }; console.log(Person('jack')); //Object { name: "jack" }
3. 手動(dòng)實(shí)現(xiàn)一個(gè)構(gòu)造函數(shù)
function myNew() { const args = Array.prototype.slice.call(arguments); const construct = args.shift(); //創(chuàng)建this,并將原型設(shè)置為構(gòu)造函數(shù)的prototype const context = Object.create(construct.prototype); //執(zhí)行構(gòu)造函數(shù),注意這里參數(shù)是數(shù)組形式所以使用apply construct.apply(context, args); //返回 const res = construct(); if ((typeof res === 'object' || res === 'function') && typeof res !== 'null') { return res; } { return context; } }; function Person(name, age) { this.name = name; this.age = age; }; const jack = myNew(Person, 'jack', 21); //Person {name: 'jack', age: 21}
到此這篇關(guān)于JavaScript面向?qū)ο缶幊虒?shí)現(xiàn)模擬的文章就介紹到這了,更多相關(guān)JS面向?qū)ο髢?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javascript函數(shù)式編程簡(jiǎn)單介紹
什么是函數(shù)式編程?根據(jù)百度百科的描述,“函數(shù)式編程是種編程典范,它將電腦運(yùn)算視為函數(shù)的計(jì)算。函數(shù)編程語(yǔ)言最重要的基礎(chǔ)是 λ 演算(lambda calculus)。而且λ演算的函數(shù)可以接受函數(shù)當(dāng)作輸入(參數(shù))和輸出(返回值)?!?/div> 2015-10-10js實(shí)現(xiàn)隨屏幕滾動(dòng)的帶緩沖效果的右下角廣告代碼
這篇文章主要介紹了js實(shí)現(xiàn)隨屏幕滾動(dòng)的帶緩沖效果的右下角廣告代碼,涉及javascript基于數(shù)學(xué)運(yùn)算及定時(shí)函數(shù)動(dòng)態(tài)操作頁(yè)面元素的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09學(xué)習(xí)JavaScript設(shè)計(jì)模式(接口)
這篇文章主要帶領(lǐng)大家學(xué)習(xí)JavaScript設(shè)計(jì)模式,其中重點(diǎn)介紹接口,舉例說(shuō)明什么是接口,對(duì)接口進(jìn)行詳細(xì)剖析,感興趣的小伙伴們可以參考一下2015-11-11javascript 自動(dòng)標(biāo)記來(lái)自搜索結(jié)果頁(yè)的關(guān)鍵字
使用javascript自動(dòng)標(biāo)記來(lái)自搜索結(jié)果頁(yè)的關(guān)鍵字的實(shí)現(xiàn)代碼。2010-01-01js中點(diǎn)擊空白區(qū)域時(shí)文本框與隱藏層的顯示與影藏問(wèn)題
文本框獲得焦點(diǎn)的時(shí)在文本框的下方顯示一個(gè)浮動(dòng)層,點(diǎn)擊文本框隱藏浮動(dòng)層,下面為大家介紹下鼠標(biāo)點(diǎn)擊時(shí)文本框與隱藏層處理問(wèn)題,感興趣的朋友可以參考下2013-08-08JavaScript學(xué)習(xí)筆記之ES6數(shù)組方法
ES6給數(shù)組添加了一些新特性,而這些新特性到目前為止完全可以運(yùn)用到自己的業(yè)務(wù)層。在這一節(jié)中將總結(jié)有關(guān)于ES6給數(shù)組提供一些新特性的使用方法2016-03-03最新評(píng)論