摘要:開扒但是,沒有類的概念,是構(gòu)造函數(shù)和原型鏈的方式來體現(xiàn)的。福利原型鏈圖示網(wǎng)上找的,看懂即可跳過上述內(nèi)容該圖把原型和構(gòu)造函數(shù)間的關(guān)系理的很清楚,可在瀏覽器的運(yùn)行并查看對(duì)象下原型間的關(guān)系。
聲明:
概念性介紹會(huì)簡單穿插,以過程式分析問題為主,便于提高實(shí)踐的意義。
前言:
面向?qū)ο螅缫褷€熟于耳,以java為最,php5.6之后更是擴(kuò)展了面向?qū)ο笫介_發(fā)(起先引入對(duì)象概念,沒當(dāng)個(gè)大方向,這下無心插柳柳成蔭,繁盛起來了),js也基于對(duì)象式開發(fā)了。。。
開扒:
但是,JS沒有類的概念,是構(gòu)造函數(shù)和原型鏈的方式來體現(xiàn)的。
我這里僅通過1個(gè)例子(有點(diǎn)懶~),盡量全面的分析下實(shí)現(xiàn)過程。
/*=================定義“類”=================*/ /*=======父類Foo=======*/ function Foo(name,age){ this.name = name; //this是當(dāng)前 [調(diào)用FOO()構(gòu)造函數(shù)的] 對(duì)象,如果有子類Bar繼承則代表子類對(duì)象 this.age = age; //this.參數(shù)名,則意味著各個(gè)對(duì)象,有屬于自己的名字和年齡 } //如上,是對(duì)象間差異化、獨(dú)立性的體現(xiàn) /*父類Foo的原型*/ Foo.prototype = { //在此定義Foo對(duì)象公有的方法/屬性,以節(jié)省內(nèi)存、便于維護(hù)(性能上:如果把sayHi()方法定義在了Foo(name,age)構(gòu)造函數(shù)中,等于說每new一個(gè)Foo或子類對(duì)象,每個(gè)對(duì)象在堆內(nèi)存就會(huì)多占點(diǎn)空間來存放sayHi()方法,耗內(nèi)存啊。) sayHi:function(){ //公有方法 alert("Hi,I"m "+this.name); }, guess:888 //公有屬性 }; /*=======子類Bar=======*/ function Bar(name,age,sex){ Foo.call(this,name,age); //等同于Foo.apply(this,[name,age]);你要初始化的東東,父類搞好了,只管調(diào)用 this.sex = sex; //Bar對(duì)象本身的特有屬性 } /*子類Bar的原型是個(gè)Foo對(duì)象*/ Bar.prototype = new Foo(); //Bar的原型類=Foo對(duì)象,意味著Bar對(duì)象能調(diào)到本身沒有卻在(Foo對(duì)象或者Foo.prototype)中存在的屬性或方法 //創(chuàng)建并調(diào)用 var bar = new Bar("Lin",18,"male"); bar.sayHi();
運(yùn)行效果:
案例補(bǔ)充說明:
1)var bar = new Bar("Lin",18,"male"); 解釋: new 一個(gè) Bar對(duì)象,名為bar. bar就繼承了Foo類的屬性和Foo原型上的方法。 2)bar.sayHi(); //可調(diào) 解釋: bar對(duì)象,首先自身查找是否有sayHi()方法,沒有則bar.__proto__得到Bar.prototype; 在Bar.prototype這個(gè)原型對(duì)象中繼續(xù)查找,而前面我們已指定Bar.prototype = new Foo(); 則意味著是在Foo對(duì)象中查找,然而Foo對(duì)象本身沒有sayHi()方法; 則調(diào)用(new Foo()).__proto__得到原型對(duì)象Foo.prototype; 繼續(xù)在該原型對(duì)象Foo.prototype中查找sayHi()方法; 終于找到了!??!返回結(jié)果吧。 擴(kuò)展: 如果依然沒找到,就會(huì)Foo.prototype.__proto__得到Object.prototype, Object.prototype本身沒有sayHi()方法,就會(huì) Object.prototype.__proto__得到null. null是最頂級(jí)的對(duì)象。在該對(duì)象中,查無此方法,就報(bào)錯(cuò)了;查無此屬性,就undefined.
涉及術(shù)語:
原型鏈 各構(gòu)造函數(shù),各有與之相對(duì)應(yīng)的原型; 類之間的繼承,就暗暗的把原型間的關(guān)系統(tǒng)籌在了一起。 頂層原型上方法或?qū)傩缘牟檎疫^程,就是依靠著原型間的這種關(guān)系,一層一層的向上查找的。 原型繼承 Bar.prototype = new Foo(); 借用繼承 Foo.call(this,name,age); //Foo.apply(this,[name,age]); 組合繼承 function Bar(name,age,sex){ Foo.call(this,name,age); this.sex = sex; } Bar.prototype = new Foo(); 現(xiàn)象式總結(jié): 僅是原型繼承,子類Bar確實(shí)可調(diào)用(父類Foo的屬性和原型上的方法)了,但實(shí)例化出來的Bar對(duì)象就不獨(dú)立了。意味著某個(gè)對(duì)象對(duì)Foo構(gòu)造函數(shù)中的屬性或方法的修改,會(huì)影響到其他對(duì)象調(diào)用的結(jié)果. 簡言之,子類可調(diào)父類了,但是實(shí)例化的對(duì)象不獨(dú)立。 僅是借用繼承,子類bar實(shí)例化的對(duì)象是獨(dú)立的,對(duì)象間不受影響,但父類原型上的方法調(diào)不了了. 推薦組合繼承,既保證了對(duì)象間的獨(dú)立性,又能調(diào)用到父類的原型上的方法。
福利:
1.原型鏈圖示(網(wǎng)上找的,看懂即可跳過上述內(nèi)容)
該圖把原型和構(gòu)造函數(shù)間的關(guān)系理的很清楚,可在Google瀏覽器的console運(yùn)行demo并查看對(duì)象下原型間的關(guān)系。
2.JS高級(jí)部分,之前看的是ali的Bosn的JavaScript深入淺出
如有不適內(nèi)容,歡迎指正。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91809.html
摘要:注本文內(nèi)容來深入面向?qū)ο竽J脚c實(shí)踐中節(jié)。面向?qū)ο笤O(shè)計(jì)與過程式編程面向?qū)ο笤O(shè)計(jì)和過程式編程有什么不同呢可能有些人認(rèn)為最大的不同在于面向?qū)ο缶幊讨邪瑢?duì)象。面向?qū)ο缶幊毯瓦^程式編程的一個(gè)核心區(qū)別是如何分配職責(zé)。 注:本文內(nèi)容來中6.2節(jié)。 6.2 面向?qū)ο笤O(shè)計(jì)與過程式編程 ??面向?qū)ο笤O(shè)計(jì)和過程式編程有什么不同呢?可能有些人認(rèn)為最大的不同在于面向?qū)ο缶幊讨邪瑢?duì)象。事實(shí)上,這種說法不準(zhǔn)確。...
摘要:聲明式編程一種編程范式,與命令式編程相對(duì)立。常見的聲明式編程語言有數(shù)據(jù)庫查詢語言,正則表達(dá)式邏輯編程函數(shù)式編程組態(tài)管理系統(tǒng)等。函數(shù)式編程,特別是純函數(shù)式編程,嘗試最小化狀態(tài)帶來的副作用,因此被認(rèn)為是聲明式的。 編程范式與函數(shù)式編程 一、編程范式的分類 常見的編程范式有:函數(shù)式編程、程序編程、面向?qū)ο缶幊獭⒅噶钍骄幊痰?。在面向?qū)ο缶幊痰氖澜纾绦蚴且幌盗邢嗷プ饔茫ǚ椒ǎ┑膶?duì)象(Class...
摘要:為什么要采用面向?qū)ο缶幊探鉀Q問題更容易設(shè)計(jì)計(jì)算機(jī)程序就是為了解決人類的問題。面向?qū)ο缶幊绦枰獙?duì)業(yè)務(wù)及代碼的架構(gòu)是有一定的要求的。 1. 編程方式 我們目前的編程方式大體可以有以下三種編程方式: 順序編程 過程式編程 面向?qū)ο缶幊? 在講面向?qū)ο缶幊虝r(shí)先講一下什么是順序編程,什么是過程式編程,什么是面向?qū)ο缶幊蹋? 順序編程: 就是只用一個(gè)單線程去執(zhí)行一段代碼,執(zhí)行過程根據(jù)代碼依次從上...
摘要:參考鏈接面向?qū)ο缶幊棠P同F(xiàn)在的很多編程語言基本都具有面向?qū)ο蟮乃枷?,比如等等,而面向?qū)ο蟮闹饕枷雽?duì)象,類,繼承,封裝,多態(tài)比較容易理解,這里就不多多描述了。 前言 在我們的日常日發(fā)和學(xué)習(xí)生活中會(huì)常常遇到一些名詞,比如 命令式編程模型,聲明式編程模型,xxx語言是面向?qū)ο蟮牡鹊?,這個(gè)編程模型到處可見,但是始終搞不清是什么?什么語言又是什么編程模型,當(dāng)你新接觸一門語言的時(shí)候,有些問題是需...
閱讀 2809·2021-11-19 11:30
閱讀 3086·2021-11-15 11:39
閱讀 1835·2021-08-03 14:03
閱讀 2017·2019-08-30 14:18
閱讀 2071·2019-08-30 11:16
閱讀 2225·2019-08-29 17:23
閱讀 2631·2019-08-28 18:06
閱讀 2563·2019-08-26 12:22