JavaScript中OOP——面向對象中的繼承/閉包

? 前 ?言

?OOP?

 JavaScript中OOP——>>>面向對象中的繼承/閉包

?

1.1面向對象的概念


  使用一個子類繼承另一個父類,子類可以自動擁有父類的屬性和方法。
?? ?? >>> 繼承的兩方,發生在兩個類之間。

?

1.2JS模擬實現繼承的三種方式:

首先,了解一下call/apply/binb:通過函數名調用方法,強行將函數中的this指向某個對象;
?? ??? ???? call寫法:? func.call(func的this指向的obj,參數1,參數2...);
?? ??? ???? apply寫法:? func.apply(func的this指向的obj,[參數1,參數2...]);
?? ??? ?? ??? binb寫法:? func.binb(func的this指向的obj)(參數1,參數2...);
?? ??? ??
?? ??? ??? call與apply的唯一區別:在于接收func函數的參數方式不同。call采用直接寫多個參數的方式,而apply采用是一個數組封裝所有參數。
?? ??? ?

   ① 擴展Object實現繼承
?? ??? ???   1:定義父類
?? ??? ? ?? ??? ??? ?function Parent(){}
?? ??? ??  ? 2:定義子類
?? ??? ??? ??? ??? ?funtion Son(){}
?? ??? ?   ? 3:通過原型給Object對象添加一個擴展方法。
?? ??? ??? ??? ??? ?Object.prototype.customExtend = function(parObj){
?? ??? ??? ??? ???????? for(var i in parObj){
?? ??? ??? ??? ??????? ??? ?// 通過for-in循環,把父類的所有屬性方法,賦值給自己
?? ??? ??? ??? ?????????? ??? ?this[i] = parObj[i];
?? ??? ??? ??? ???????? }
?? ??? ??? ??? ???? }
?? ??? ???  ? 4:子類對象調用擴展方法
?? ??? ??? ??? ?  ?? ?Son.customExtend(Parent);

?

① eg:
 1     // 1.定義父類
 2         function Person(name,age){
 3             this.name = name;
 4             this.age = age;
 5             this.say = function(){
 6                 alert(this.name+":"+this.age);
 7             }
 8         }
 9         // 2.定義子類
10         function Student(no){
11             this.no = no;
12             this.add = function(a,b){
13                 alert(a+b);
14             }
15         }
16         function Programmer(lang){
17             this.lang = lang;
18             this.codding = function(){
19                 alert("我愛敲代碼!敲代碼使我快樂!");
20             }
21         }
22         // 3.通過原型給Object對象添加一個擴展方法。
23         Object.prototype.customExtend = function(parObj){
24             for(var i in parObj){ 
25                 // 通過for-in循環,把父類的所有屬性方法,賦值給自己
26                    this[i] = parObj[i];
27             }
28         }
29         
30         var p = new Person("小明","18");
31         var s = new Student("0001");
32         s.customExtend(p);//現在s繼承了p的所有屬性和方法。
33         console.log(s)
34         
35         var pro = new Programmer("JavaScript");
36         pro.customExtend(p);
37         console.log(pro)
38         
39 
40         
41         

?

?


    ② 使用call/apply/binb.
?? ??? ???????? 1:定義父類
?? ??? ??????? ??? ?funtion Parent(””,””,””){}
?? ??? ??? ??? ?2:定義子類
?? ??? ??? ??? ???? function Son(””,””,””){}
?? ??? ??? ??? ?3:在子類中通過call方法/apply/binb方法去調用父類。
?? ??? ??? ??? ???? function Son(){
?? ??? ??? ??? ??? ??? ?Parent.call(this,””,””,””);// Parent.apply(this,[””,””,””]);//Parent.binb(this)(””,””,””);
?? ??? ??? ??? ???? }

?

② eg:

?

 1         function Person(name,age){
 2             this.name = name;
 3             this.age = age;
 4             this.say = function(){
 5                 alert("我叫:"+this.name+";今年:"+this.age+"歲");
 6             }
 7         }
 8         
 9         /** 文檔注釋,調用函數時,可以看到注釋內容。
10          * 
11          * no:學員編號
12          * stuName:學員姓名
13          * stuAge:學員年齡
14          */
15         function Student(no,stuName,stuAge){
16             
17             this.no = no;
18             Person.call(this,stuName,stuAge);
19             // 執行上述代碼,相當于將下面的代碼執行一遍。并且把原來Person類的this直接替換為Stundet的this(當實例化Student時的那個對象)
20             
21 //            this.name = "張三";
22 //            this.age = 14;
23 //            this.say = function(){
24 //                alert("我叫:"+this.name+";今年:"+this.age+"歲");
25 //            }
26         }
27         
28         var stu = new Student(12,"zhangsan",14);
29         stu.say();
30         
31         console.log(stu)
32         
33         //Person("zhangsan","123");

?


  ?③ 使用原型繼承
?? ??? ???????? 1:定義父類
?? ??? ??????????? function Parent(””,””,””){}
?? ??? ??? ??? ?2:定義子類
?? ??? ??? ??? ??? function Son(””,””,””){}
?? ??? ??? ??? ?3:把在子類對象的原型對象聲明為父類的實例。
?? ??? ??? ??? ??? Son.prototype = new Parent(””,””,””);

?

③ eg:

?

 1         function Person(name,age){
 2             this.name = name;
 3             this.age = age;
 4             this.say = function(){
 5                 alert("我叫:"+this.name+";今年:"+this.age+"歲");
 6             }
 7         }
 8         
 9         /** 文檔注釋,調用函數時,可以看到注釋內容。
10          * 
11          * no:學員編號
12          * stuName:學員姓名
13          * stuAge:學員年齡
14          */
15         function Student(no){
16             this.no = no;
17         }
18         
19         Student.prototype = new Person("張三",14)
20         
21         var stu = new Student(12);
22         
23         stu.say();
24         
25         console.log(stu)
26         
27         //Person("zhangsan","123");

?

1.3面向對象中的閉包


   1、 全局變量:函數外聲明的變量
?? ??? ????? 局部變量:函數內聲明的變量
?? ??? ??
?? ??? ????? 在JS中,函數為唯一的局部作用域,而if、for等其他{}沒有自己的作用域
?? ??? ??
?? ??? ????? 所以,函數外不能訪問局部變量。其實,變量在函數執行完畢以后,占用的內存就被釋放。
?? ??? ??
?? ??? ?? 2、如何訪問函數私有變量?
?? ??? ????? JS中,提供了一種"閉包"的概念:在函數內部,定義一個子函數,可以用子函數訪問父函數的私有變量。執行完操作以后,將子函數通過return返回。
?? ??? ??
?? ??? ??? ? ?? ?function func2(){
?? ??? ??? ??? ??? ?var num = 1;
?? ??? ??? ??? ??? ?function func3(){
?? ??? ??? ??? ??? ??? ?var sum = num+10;
?? ??? ??? ??? ??? ??? ?alert(sum);
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?return func3;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?
?? ??? ??? ??? ?var f = func2();
?? ??? ??? ??? ?f();
?? ??? ??
?? ??? ?? 3、閉包的作用:
?? ??? ????? ① 訪問函數的私有變量;
?? ??? ????? ② 讓函數的變量始終存在于內存中,而不被釋放。

轉載于:https://www.cnblogs.com/zhuanzhibukaixin/p/6849230.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258781.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js常用字符串函數

這些東西是以前整理的,放到這里,有需要的可以看看~挺全的~ /** * anchor()方法 * 在對象中的指定文本兩端放置一個有Name屬性的HTML錨點 * strVariable.anchor(anchorString) anchorString為錨點名稱 * 它本身不會檢查其他的ahchor錨點是否有name指…

c++11中的智能指針

在C11中有四種智能指針,auto_ptr,shared-ptr,unique_ptr和weak-ptr,其中auto_ptr有許多不足之處,在C11中已經建議廢棄使用。 1. shared_ptr std::shared_ptr智能指針可以通過共享指向對象的所有權,從而實現…

ubuntu14.04設置靜態IP

啊,最近懶惰了,好久沒有寫博客了。 一般機器啟動的時候會自動從DHCP服務器上面獲取動態IP地址,這是一件很方便的事情,可以不用手動設置網絡相關的蠶參數,但是有時候還是需要機器固定IP地址的。 第一步,編輯…

高中學歷python培訓靠譜嗎_高中學歷學完Python就能干人工智能?

最近Python大熱,主要是人工智能的熱度,昨天后院活動部介紹了一位女網友為男朋友選擇Java還是Python,大量的程序員熱議,也有人詢問如何學習Python,比如這位網友詢問高中學歷學習Python是不是就能干人工智能。兄弟&#…

curl+個人證書(又叫客戶端證書)訪問https站點

目前,大公司的OA管理系統(俗稱內網),安全性要求較高,通常采用https的雙向 認證模式。 首先,什么是https,簡單的說就是在SSL協議之上實現的http協議(get、post等操作)。更…

boot.oat FC問題分析報告

【NE現場】 pid: 5252, tid: 5252, name: ndroid.contacts >>> com.android.contacts <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x1458x0 0000000000000000 x1 0000000090d9892c x2 0000000000000001 x3 000000000000012cx4 …

c++ 虛函數的實現機制

轉載自&#xff1a;http://blog.csdn.net/jiangnanyouzi/article/details/3720807 1、c實現多態的方法 其實很多人都知道&#xff0c;虛函數在c中的實現機制就是用虛表和虛指針&#xff0c;但是具體是怎樣的呢&#xff1f;從more effecive c其中一篇文章里面可以知道&#xff…

powerdesigner 技巧

1.修改建表腳本生成規則。如果每個表格都有相同的字段&#xff0c;可以如下修改&#xff1a; Database -> Edit Current DBMS 展開 Script -> Object -> Table -> Create 見右下的Value值&#xff0c;可以直接修改如下&#xff1a;/* tablename: %TNAME% */ create…

勒索病毒攻擊應急防范

北京時間5月12日&#xff0c;互聯網上出現針對Windows操作系統的勒索軟件&#xff08;Wannacry&#xff09;攻擊案例。勒索軟件利用此前披露的Windows SMB服務漏洞&#xff08;對應微軟漏洞公告&#xff1a;MS17-010&#xff09;攻擊手段&#xff0c;向終端用戶進行滲透傳播&am…

C++中虛析構函數的作用

C中的虛析構函數到底什么時候有用的&#xff0c;什么作用呢。 總的來說虛析構函數是為了避免內存泄露&#xff0c;而且是當子類中會有指針成員變量時才會使用得到的。也就說虛析構函數使得在刪除指向子類對象的基類指針時可以調用子類的析構函數達到釋放子類中堆內存的目的&…

蘋果Swift編程語言入門教程【中文版】

http://www.25pp.com/news/news_60984.html轉載于:https://www.cnblogs.com/niaowo/p/4564298.html

python正則表達式匹配aabb_Python正則表達式拆分多個匹配項

我正在嘗試將包含2個不同字符的序列的字符串拆分為多個組.如果我們假設字符是a和b,則用于分組的純文本規則為&#xff1a;>組包含0 a,后跟1 b>后面的所有a都包含在下一組中,除非我們在單詞末尾.例如&#xff1a;處理測試后,目標是分成預期的組.tests [abab,ababab,aabab…

MEF 導入(Import)和導出(Export)

前言&#xff1a; MEF不同于其他IOC容器&#xff08;如&#xff1a;Castle&#xff09;很重要的原因在于它使用了特性化編程模型&#xff08;涉及到兩個概念&#xff1a;“特性”和“編程模型”&#xff09;。 特性&#xff08;Attribute&#xff09;&#xff1a;舉例來說就是我…

Android SimpleAdapter的參數

1.作用是ArrayList和 ListView的橋梁。這個ArrayList里邊的每一項都是一個Map<String,?>類型。 ArrayList當中的每一項 Map對象都和ListView里邊的每一項進行數據綁定一一對應。2.SimpleAdapter的構造函數&#xff1a;SimpleAdapter(Context context, List<? …

JMeter 教程匯總鏈接

http://www.360doc.com/content/14/0318/23/16361380_361732630.shtml 可以作為入門系列教程。 盡管網頁也給出了視頻鏈接&#xff0c;但是我不建議看視頻學習&#xff01; 建議直接看文字&#xff08;可以跳躍式學習&#xff0c;視頻的則是線性學習&#xff09;轉載于:https:…

C++ STL中set底層實現方式

Q&#xff1a;STL中set底層實現方式&#xff1f; 為什么不用hash&#xff1f; A: 第一個問題:set底層實現方式為RB樹&#xff08;即紅黑樹&#xff09;。 第二個問題: 首先set&#xff0c;不像map那樣是key-value對&#xff0c;它的key與value是相同的。關于set有兩種說法&…

python自動獲取天氣_用python獲取天氣數據,并作定時播報

原標題&#xff1a;用python獲取天氣數據&#xff0c;并作定時播報數據挖掘入門與實戰 公眾號&#xff1a; datadw思路1.調用和風天氣的API&#xff0c;獲取天氣數據2.用百度語音API&#xff0c;將天氣數據合成語音3.用樹莓派每天早上定時播報天氣(定時任務crontab Python腳本…

c++實現解析文件路徑

注意&#xff1a;本實現只能解析類似linux下的路徑&#xff0c;即“/data/a.txt”&#xff0c;而不能解析“c:\a.txt” 或者“c:\\a.txt”&#xff0c;但是應該很容易擴展改寫實現此功能。 FilepathParse.h #include <string> using std::string;void parseFilepath(str…

gedit搭建c開發環境

在管理外部工具中&#xff0c;創建啟動腳本 1 #!/bin/sh 2 DIR$GEDIT_CURRENT_DOCUMENT_DIR 3 NAME$GEDIT_CURRENT_DOCUMENT_NAME 4 /home/lxy/code/c/struct/run.sh ${DIR}/${NAME} 創建run.sh #!/bin/sh file$1 ext${file##*.}#C if [ $ext "c" ]; thenif [ -f $f…