摘要:跟這三種用法相對應(yīng)的有三種子類型,分別是對象的屬性變量包括參數(shù)和創(chuàng)建出來的類型實例對象的屬性。這三種子類是相互獨立的,而且也很容易區(qū)分。三種子類型不可以相互進行調(diào)用之外,還有一種情況也非常重要那就是對象的屬性并沒有繼承的關(guān)系。
回到了自己的家鄉(xiāng),期待中有感覺到了很多的陌生,一個有“故事”的環(huán)境中,你我是否“孤獨”!函數(shù)的類型
在我看來function共有三種類型,作為對象使用,處理業(yè)務(wù)以及穿件object的實例對象。跟這三種用法相對應(yīng)的有三種子類型,分別是對象的屬性、變量(包括參數(shù))和創(chuàng)建出來的object類型實例對象的屬性。這三種子類是相互獨立的,而且也很容易區(qū)分。但是,我們剛剛接觸的時候很容易混淆。
1.function 作為對象來使用這種情況下,function對象的子類型就是對象自己的屬性,這時通過操作符“.”(或者方括號操作符)使用,示例如下:
function book(){} book.price=999; book["getPrice"]=function(){ return this.price; } console.log(book.getPrice()); //輸出結(jié)果:999
我很少碰到function來作為object類型的對象來使用。2.funciton 用于處理業(yè)務(wù)
這種情況下,function的子類型就是自己定義的局部變量(包括參數(shù)),這時的變量實在方法被調(diào)用時通過變量作用域鏈來管理的。
關(guān)于變量我之前的文檔中有涉及到,這里就不過多的說明了。
這種情況下,對應(yīng)的子類型是使用function創(chuàng)建實例對象的屬性(很常用),主要包括在function中通過this添加屬性,以及創(chuàng)建完成之后實例對象自己添加的屬性。另外,還可以調(diào)用function的prototype屬性對象所包含的屬性,示例如下:
function Car(color,displacement){ this.color = color; this.displacement = displacement; } Car.prototype.logMessage = function(){ console.log(this.color+","+this.displacement); }; var car = new Car("yellow","2.4T");//看看是不是類似構(gòu)造函數(shù)?哈哈
這個例子中創(chuàng)建的car對象就包含有color和displacement兩個屬性,而且還可以調(diào)用Car.prototype的logMessage方法。當(dāng)然,創(chuàng)建完之后還可以使用點操作符給創(chuàng)建的car對象添加或者修改屬性,也可以使用delete刪除其中的屬性,示例如下:
function Car(color,displacement){ this.color = color; this.displacement = displacement; } //所有創(chuàng)建出來的car都有該方法 Car.prototype.logMessage = function(){ console.log(this.color+","+this.displacement); }; var car = new Car("yellow","2.4T");//看看是不是類似構(gòu)造函數(shù)?哈哈 //給car對象添加屬性 car.logColor = function(){ console.log(this.color); }; //完成調(diào)用測試 car.logColor();//輸出結(jié)果: yellow car.color = "red"; car.logColor();//輸出結(jié)果:red delete car.color;//刪除屬性 car.logColor();//輸出結(jié)果:undefined
代碼分析:三種子類型的關(guān)系在創(chuàng)建完car對象之后,又給它添加了logColor的方法,可以打印car的color屬性。添加完logColor方法后直接調(diào)用就可以打印出car原來的color屬性值(yellow)。然后,將其修改為red,在打印出了red。最后,使用delete刪除car的color的屬性,這時在調(diào)用logColor方法會打印出undefined
其實跟我的注釋說明一致!!!
function的三種子類型是相互獨立的,他們只能在自己所對應(yīng)的環(huán)境中使用而不能相互調(diào)用,示例如下:
function log(msg){//第二種業(yè)務(wù)處理 console.log(msg); } function Bird(){ var name = "kitty"; this.type = "pigeon"; this.getName = function(){ return this.name;//創(chuàng)建的對象沒有name屬性 } } Bird.color = "white";//第一種object類型的對象 Bird.getType = function(){//第一種object類型的對象 return this.type; }; Bird.prototype.getColor = function(){//第三種創(chuàng)建對象 return this.color; } var bird = new Bird(); log(bird.getColor());// undefined log(bird.getName()); // undefined log(bird.getType()); // undefined
Bird 作為對象時包含 color 和 getType 兩個屬性,作為處理業(yè)務(wù)的函數(shù)是包含一個名為name的局部變量,創(chuàng)建的實例對象bird具有type和getName兩個屬性,而且還可以調(diào)用Bird.prototype的getColor屬性,getColor也可以看作bird的屬性。
用 法 | 子 類 型 |
---|---|
對象(Bird) | color 、getType |
處理業(yè)務(wù)(Bird方法) | name |
創(chuàng)建實例對象(bird) | type、getName、(getColor) |
每種用法中所定義的方法只能調(diào)用相對應(yīng)所對應(yīng)的屬性,而不能交叉調(diào)用,從對應(yīng)關(guān)系中可以看出,getName、getColor和getType三個方法中無法獲取到值,大家再仔細(xì)分析一下!
另外,getName和getColor是bird的屬性方法,getType是Bird的屬性方法,如果用Bird對象調(diào)用getName或getColor方法或者使用bird對象調(diào)用getType方法都會拋出找不到的錯誤。
三種子類型不可以相互進行調(diào)用之外,還有一種情況也非常重要:那就是對象的屬性并沒有繼承的關(guān)系。
function obj(){} obj.v=1; obj.func = { logV : function(){ console.log(this.v); } } obj.func.logV();
代碼分析:關(guān)聯(lián)三種子類型這個例子中的obj是作為對象使用的,obj是有一個屬性v和一個對象屬性func,func對象中又有一個logV方法,logV方法用于打印對象的v屬性。這里需要特別注意:
logV方法打印的是func對象的v屬性,但是func對象中并沒有v屬性,所以最后結(jié)果是undefined。
這個例子中,雖然obj對象中包含v屬性,但是由于屬性不可以繼承,所以obj的func屬性對象中的方法不可以使用obj中的屬性v.
請大家一定要記住,并且不要和prototype的繼承以及變量作用域鏈相混淆
三種子類型本來是相互獨立、各有各的使用環(huán)境的,但是,有一些情況下需要操作不屬于自己所對應(yīng)環(huán)境的子類型,這時就需要使用一些技巧來實現(xiàn)了。
約定如下
function 作為對象使用時記作 O(Object)
作為函數(shù)使用時記作 F(Function)
創(chuàng)建出來的對象實例記作 I(Instance)
op(object property)
v(variable)
ip(instance property)
op | v | ip | |
---|---|---|---|
O | 直接調(diào)用 | 在函數(shù)中關(guān)聯(lián)到O的屬性 | 不可調(diào)用 |
F | 使用O調(diào)用 | 直接調(diào)用 | 不可調(diào)用 |
I | 使用O調(diào)用 | 在函數(shù)中關(guān)聯(lián)到I的屬性 | 直接調(diào)用 |
縱向表頭表示function的不同用法
橫向表頭表示三種類型,表格的主體表示在function相應(yīng)用法中調(diào)用各種子類的方法。
因為function創(chuàng)建的實例對象在創(chuàng)建之前還不存在,所以function作為方法(F)和作為對象(O)使用時無法調(diào)用function創(chuàng)建的實例對象的屬性(ip)。調(diào)用參數(shù)可以在函數(shù)中將變量關(guān)聯(lián)到相應(yīng)的屬性,調(diào)用function作為對象(O)時的屬性可以直接使用 function 對象來調(diào)用
function log(msg){ console.log(msg); } function Bird(){ //私有屬性 var name = "kitty"; var type = "pigeon"; //將局部變量name關(guān)聯(lián)到新創(chuàng)建的對象的getName,setName屬性方法 //閉包可以使用局部變量 //公有屬性 this.getName = function(){ return name; } this.setName = function(n){ name = n; } //將局部變量type關(guān)聯(lián)到Bird對象getType屬性方法 //靜態(tài)屬性 Bird.type = function(){ return type; } //在業(yè)務(wù)處理中調(diào)用Bird對象的color屬性 log(Bird.color);//輸出結(jié)果: white,F調(diào)用op } Bird.color = "white";// 代表 O //在創(chuàng)建出的實例對象中調(diào)用Bird對象的color屬性 Bird.prototype.getColor = function(){//I return Bird.color;//OP } var bird = new Bird(); // 創(chuàng)建實例 I log(bird.getColor()); // 輸出結(jié)果:white , I 調(diào)用 op log(bird.getName());// 輸出結(jié)果:kitty , I 調(diào)用 v 局部變量 log(Bird.getType());// 輸出結(jié)果:pigeon , O 調(diào)用 v 局部變量 bird.setName("petter"); // I 調(diào)用 v log(bird.getName());// 輸出結(jié)果:petter , I 調(diào)用 v 局部變量
好好分析上述的代碼,非常經(jīng)典的,了解三種子類型的不同環(huán)境用法中交叉調(diào)用的方法附錄:“公有屬性” “私有屬性” 和 “靜態(tài)屬性”
上面的示例中我們涉及到了公有屬性、私有屬性和靜態(tài)屬性的說明,由于JS并不是基本類而是基于對象的語言,因此JS本身并沒有這些概念。
公有屬性:一般指使用function對象創(chuàng)建出object實例對象所擁有的屬性。
私有屬性:一般指function的內(nèi)部變量
靜態(tài)屬性:一般指function對象自己的屬性
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/108883.html
摘要:我將上述內(nèi)容進行簡單的整理,來回答標(biāo)題的提問前端開發(fā)者如何把握住微信小程序這波紅利迅速掌握微信小程序相關(guān)技術(shù)。 由于前兩周一直在老家處理重要事情,雖然朋友圈被「微信小程序」刷爆了,但并沒有時間深入了解。 昨天回廣州之后,第一件事情就是把「微信小程序」相關(guān)的文章、開發(fā)文檔、設(shè)計規(guī)范全部看了一遍,基本上明白了「微信小程序」是怎么回事,我關(guān)注的公眾號都很看好「微信小程序」的前景。 作為一個「...
摘要:碰到這種面試官,你只有是個題霸,再加上眼緣夠才能順利入圍。只要按照我題目的思路,甚至打出來測試用例看看,就能實現(xiàn)這個題目了。答案根據(jù)的,對答案做出修正。另我的答案絕不敢稱最佳,隨時歡迎優(yōu)化修正。但了解總歸是好的。 我們在長期的面試過程中,經(jīng)歷了種種苦不堪言,不訴苦感覺不過癮(我盡量控制),然后主要聊聊常見JavaScript面試題的解法,以及面試注意事項 憶苦 面試第一苦,面試官的土 ...
摘要:在眾多消息里,啃先生排除掉預(yù)測類的信息,汲取了對于技術(shù)從業(yè)者有用的信息,整理出此文章,說說微信小程序開發(fā)的設(shè)計理念和入門。以上至少四個文件,即可生成一個最簡單的微信小程序。 昨晚臨睡覺前,還在想應(yīng)該給xx打個電話,問問微信應(yīng)用號應(yīng)該有原生 UI 吧,要不然跟直接跑 HTML 5 有什么區(qū)別? 而今天一大早我便一本正經(jīng)胡說八道猜想,微信小程序不會有 JS IDE ,一個小時之后,發(fā)現(xiàn)被打...
閱讀 2906·2023-04-26 01:01
閱讀 3682·2021-11-23 09:51
閱讀 2513·2021-11-22 14:44
閱讀 3541·2021-09-23 11:57
閱讀 2826·2021-09-22 14:58
閱讀 5866·2021-09-10 11:25
閱讀 2099·2019-08-30 13:11
閱讀 1588·2019-08-30 12:59