摘要:屬性屬性當(dāng)我們通過(guò)關(guān)鍵字構(gòu)造函數(shù)實(shí)例化創(chuàng)建一個(gè)對(duì)象時(shí),這個(gè)對(duì)象里面含有屬性,屬性指向構(gòu)造函數(shù)屬性以及屬性下面的對(duì)象。
眾所周知,JavaScript是一門(mén)面向?qū)ο蟮牟僮髡Z(yǔ)言,而我們想要用JavaScript對(duì)象化寫(xiě)法的時(shí)候,不得不提出一個(gè)操作符,叫做new操作符,那么不用new操作符和用new操作符有什么區(qū)別呢?
1.用new和不用new的區(qū)別首先,我們?nèi)タ聪耼ew在JavaScript里面的用法,按照javascript語(yǔ)言精粹中所說(shuō),如果在一個(gè)函數(shù)前面帶上new來(lái)調(diào)用該函數(shù),那么將創(chuàng)建一個(gè)隱藏連接到該函數(shù)的prototype成員的新對(duì)象,同時(shí)this將被綁定到那個(gè)新對(duì)象上。這句話說(shuō)得很抽象,我們根據(jù)代碼來(lái)理解。
function foo(){ this.name = "John"; this.age = 23; var born = 1993; return this.age; } //沒(méi)用new關(guān)鍵字 var foo2 = foo(); console.log(foo2);//23 //用new關(guān)鍵字 var foo3 = new foo(); console.log(foo3);//foo {name: "John", age: 23}
通過(guò)上面的代碼可以明顯看出區(qū)別,當(dāng)我們不用new關(guān)鍵字的時(shí)候我們只是把foo函數(shù)運(yùn)行了一遍,如果有返回值就就獲得這個(gè)返回值,沒(méi)有返回值就輸出underfind,只是簡(jiǎn)單的函數(shù)運(yùn)行一遍而已。
但是當(dāng)我們用new關(guān)鍵字的時(shí)候,我們就可以看到不同了,new關(guān)鍵字是生成一個(gè)對(duì)象,并且生成的對(duì)象里面的屬性是foo函數(shù)公有屬性(即只有用this關(guān)鍵字定義的變量),而忽略掉私有變量(即用var定義的變量)和函數(shù)返回值,這樣上面關(guān)于new關(guān)鍵字的解釋就好理解了,即通過(guò)new操作符創(chuàng)建一個(gè)連接到foo函數(shù)的對(duì)象,對(duì)象里包含foo函數(shù)里面所有屬性和方法。這就是new關(guān)鍵字的作用,并且this是指向我們當(dāng)前的對(duì)象foo3.
js語(yǔ)言沒(méi)有類這個(gè)概念,所以提出用原型來(lái)代替類來(lái)實(shí)現(xiàn)js面向?qū)ο髮?xiě)法。js規(guī)定每個(gè)函數(shù)都具有prototype對(duì)象,并且prototype對(duì)象在函數(shù)外部是可以訪問(wèn)的,可以通過(guò)"prototype.xxx"來(lái)為當(dāng)前函數(shù)增加屬性和方法,所以prototype屬性可以理解為當(dāng)我們想為這個(gè)函數(shù)添加屬性或者方法時(shí)我們可以在prototype屬性下面添加,而不需要去改變構(gòu)造函數(shù)的代碼。
function foo(){ this.name = "John"; this.age = 23; var born = 1993; return this.age; } foo.prototype.ccc = function(){ console.log(this.name); } console.log(foo.prototype);//Object {}
chrome的運(yùn)行結(jié)果如下圖:
可以看到foo函數(shù)里的prototype是可以訪問(wèn)的,并且我們所添加的函數(shù)是在prototype對(duì)象里的。這樣,我們就可以通過(guò)prototype屬性向?qū)ο筇砑訉傩院头椒ā?/p> 2.2constructor(構(gòu)造器)屬性
在上面的我們看到chrome瀏覽器運(yùn)行結(jié)果的圖中,我們打印foo函數(shù)prototype對(duì)象可以發(fā)現(xiàn)里面包含有constructor屬性,所以constructor屬性的是prototype對(duì)象下的一個(gè)屬性,即:
function foo(){ this.name = "John"; this.age = 23; var born = 1993; return this.age; } console.log(foo.prototype.constructor == foo);//true
可以看到原型對(duì)象下的constructor事指向當(dāng)前構(gòu)造函數(shù)的,函數(shù)在創(chuàng)建時(shí)就會(huì)自動(dòng)生成constructor屬性來(lái)指向當(dāng)前對(duì)象,實(shí)例化對(duì)象時(shí)constructor屬性也會(huì)一并繼承到新的對(duì)象下面。
2.3__proto__屬性__proto__屬性當(dāng)我們通過(guò)new關(guān)鍵字構(gòu)造函數(shù)實(shí)例化創(chuàng)建一個(gè)對(duì)象時(shí),這個(gè)對(duì)象里面含有__proto__屬性,__proto__屬性指向構(gòu)造函數(shù)prototype屬性以及prototype屬性下面的對(duì)象。即:
function foo(){ this.name = "John"; this.age = 23; var born = 1993; return this.age; } foo.prototype.ccc = function(){ console.log(this.name); } var foo2 = new foo(); console.log(foo2.__proto__ == foo.prototype)//true console.log(foo2.__proto__)//Object {ccc:function(),constructor: foo()}
console.log(foo2.__proto__)在chrome里的運(yùn)行結(jié)果如下圖:
可以看到__proto__對(duì)象是等于foo.prototype對(duì)象的,并且foo.prototype對(duì)象下面的方法和屬性都已經(jīng)在實(shí)例化對(duì)象foo2下的__proto__下面了。
3.js的原型鏈js沒(méi)有其他面向?qū)ο缶幊陶Z(yǔ)言的多態(tài)的概念,所以如何實(shí)現(xiàn)多態(tài)的概念。這時(shí),js提出了原型鏈的概念,通過(guò)原型鏈來(lái)實(shí)現(xiàn)擴(kuò)展方法以及屬性的功能??慈缦麓a
function foo(){ this.name = "John"; this.age = 23; var born = 1993; return this.age; } foo.prototype.ccc = function(){ console.log(this.name); } var foo2 = new foo(); foo2.ccc();//John var foo3 = new foo(); foo3.ccc();//John //修改foo3對(duì)象下面ccc方法 foo3.ccc = function(){ console.log(this.age); } foo3.ccc();//23
從上面代碼實(shí)例化對(duì)象時(shí)新的對(duì)象不僅克隆了構(gòu)造的函數(shù)屬性和方法,也克隆了構(gòu)造函數(shù)原型下的屬性以及方法,在foo3對(duì)象中,當(dāng)我們沒(méi)有修改ccc方法時(shí),函數(shù)會(huì)在當(dāng)前對(duì)像下查找,沒(méi)查找到就會(huì)去原型對(duì)象里查找該方法,在原型對(duì)象里找到了ccc方法,打印出this.name為“John”,當(dāng)我們重寫(xiě)了ccc方法時(shí),ccc方法就已經(jīng)foo3當(dāng)前對(duì)象下面了,所以在當(dāng)前對(duì)象下面找到了ccc方法,運(yùn)行ccc方法,并且停止查到,不會(huì)再繼續(xù)向下查,所以js原型鏈會(huì)遵循就近查找原則,如果查找不到當(dāng)前方法會(huì)到原型下去查找,查找不到再去原型下面的原型去查找,直到查找到所有原型為止。
我們答應(yīng)下foo3對(duì)象,console.log(foo3),在chrome運(yùn)行結(jié)果如下圖:
可以看出foo3對(duì)象下面擁有一個(gè)ccc方法,并且在原型對(duì)象下面也擁有一個(gè)ccc方法,遵循就近查找原則,會(huì)找到foo3對(duì)象下面的ccc方法,而不會(huì)去查到原型對(duì)象里的ccc方法。所以通過(guò)js的原型鏈可以修改對(duì)象的屬性和方法。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79931.html
摘要:我們通過(guò)表單驗(yàn)證的功能,來(lái)逐步演進(jìn)面向?qū)ο蟮姆绞綄?duì)于剛剛接觸的朋友來(lái)說(shuō),如果要寫(xiě)一個(gè)驗(yàn)證用戶名,密碼,郵箱的功能,一般可能會(huì)這么寫(xiě)表單驗(yàn)證全局全局全局這種寫(xiě)法,從功能上來(lái)說(shuō)沒(méi)有什么問(wèn)題,但是在團(tuán)隊(duì)協(xié)作的時(shí)候,會(huì)造成覆蓋全局變量的問(wèn)題,那要大 我們通過(guò)表單驗(yàn)證的功能,來(lái)逐步演進(jìn)面向?qū)ο蟮姆绞? 對(duì)于剛剛接觸javascript的朋友來(lái)說(shuō),如果要寫(xiě)一個(gè)驗(yàn)證用戶名,密碼,郵箱的功能, 一...
摘要:這個(gè)構(gòu)造函數(shù)的不管從調(diào)用方式還是內(nèi)部寫(xiě)法就都很有的感覺(jué),但是從用途上來(lái)說(shuō),它其實(shí)更靠近的概念是中的工廠方法。到這里,所有關(guān)于繼承的東西講完了,接下來(lái)準(zhǔn)備準(zhǔn)備說(shuō)說(shuō)當(dāng)中的封裝 所謂的對(duì)象,就是抽象化的數(shù)據(jù)本身 一個(gè)面向?qū)ο筠D(zhuǎn)向面向原型的困惑 我發(fā)現(xiàn)Javascript這門(mén)語(yǔ)言每次翻開(kāi)都會(huì)帶給人新感受,尤其是看完其他語(yǔ)言的面向?qū)ο笤賮?lái)看它,但是如果你也是過(guò)來(lái)人就一定記得教科書(shū)里面冗長(zhǎng)乏味的...
摘要:回到最開(kāi)始的組件問(wèn)題那么,說(shuō)了這么多面向?qū)ο螅F(xiàn)在回到最開(kāi)始的那個(gè)組件的實(shí)現(xiàn)如何用面向?qū)ο髞?lái)實(shí)現(xiàn)。總結(jié)從一個(gè)組件出發(fā),一步一步爬坑,又跑去介紹中的面向?qū)ο螅绻隳芸吹阶詈?,那么你就可?dòng)手一步一步實(shí)現(xiàn)一個(gè)了,純調(diào)侃。 其實(shí),無(wú)論是寫(xiě)什么語(yǔ)言的程序員,最終的目的,都是把產(chǎn)品或代碼封裝到一起,提供接口,讓使用者很舒適的實(shí)現(xiàn)功能。所以對(duì)于我來(lái)說(shuō),往往頭疼的不是寫(xiě)代碼,而是寫(xiě)注釋和文檔!如果接...
摘要:不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例的信息。其次,按照一切事物皆對(duì)象的這餓極本的面向?qū)ο蟮姆▌t來(lái)說(shuō),類本身并不是一個(gè)對(duì)象,然而原型方式的構(gòu)造函數(shù)和原型本身也是個(gè)對(duì)象。第二個(gè)問(wèn)題就是在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 前言 對(duì)象(Object)應(yīng)該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設(shè)計(jì)中各出沒(méi)。寫(xiě)這篇文章,主要參考與JavaScrip...
摘要:春招季如何橫掃面試核心考點(diǎn)基礎(chǔ)版前端面試之路二基礎(chǔ)整理的繼承和的繼承有什么區(qū)別的繼承時(shí)通過(guò)或構(gòu)造函數(shù)機(jī)制來(lái)實(shí)現(xiàn)。作用創(chuàng)建私有變量,減少全局變量,防止變量名污染。異步瀏覽器訪問(wèn)服務(wù)器請(qǐng)求,用戶正常操作,瀏覽器后端進(jìn)行請(qǐng)求。 春招季如何橫掃 Javascript 面試核心考點(diǎn)(基礎(chǔ)版)?前端面試之路二(javaScript基礎(chǔ)整理) ES5的繼承和ES6的繼承有什么區(qū)別 ES5的繼承時(shí)通過(guò)...
閱讀 2040·2023-04-26 02:15
閱讀 2309·2021-11-19 09:40
閱讀 1051·2021-10-27 14:13
閱讀 3322·2021-08-23 09:44
閱讀 3622·2019-12-27 12:24
閱讀 661·2019-08-30 15:53
閱讀 1175·2019-08-30 10:53
閱讀 2167·2019-08-26 12:14