摘要:開扒但是,沒有類的概念,是構造函數(shù)和原型鏈的方式來體現(xiàn)的。福利原型鏈圖示網上找的,看懂即可跳過上述內容該圖把原型和構造函數(shù)間的關系理的很清楚,可在瀏覽器的運行并查看對象下原型間的關系。
聲明:
概念性介紹會簡單穿插,以過程式分析問題為主,便于提高實踐的意義。
前言:
面向對象,早已爛熟于耳,以java為最,php5.6之后更是擴展了面向對象式開發(fā)(起先引入對象概念,沒當個大方向,這下無心插柳柳成蔭,繁盛起來了),js也基于對象式開發(fā)了。。。
開扒:
但是,JS沒有類的概念,是構造函數(shù)和原型鏈的方式來體現(xiàn)的。
我這里僅通過1個例子(有點懶~),盡量全面的分析下實現(xiàn)過程。
/*=================定義“類”=================*/ /*=======父類Foo=======*/ function Foo(name,age){ this.name = name; //this是當前 [調用FOO()構造函數(shù)的] 對象,如果有子類Bar繼承則代表子類對象 this.age = age; //this.參數(shù)名,則意味著各個對象,有屬于自己的名字和年齡 } //如上,是對象間差異化、獨立性的體現(xiàn) /*父類Foo的原型*/ Foo.prototype = { //在此定義Foo對象公有的方法/屬性,以節(jié)省內存、便于維護(性能上:如果把sayHi()方法定義在了Foo(name,age)構造函數(shù)中,等于說每new一個Foo或子類對象,每個對象在堆內存就會多占點空間來存放sayHi()方法,耗內存啊。) 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]);你要初始化的東東,父類搞好了,只管調用 this.sex = sex; //Bar對象本身的特有屬性 } /*子類Bar的原型是個Foo對象*/ Bar.prototype = new Foo(); //Bar的原型類=Foo對象,意味著Bar對象能調到本身沒有卻在(Foo對象或者Foo.prototype)中存在的屬性或方法 //創(chuàng)建并調用 var bar = new Bar("Lin",18,"male"); bar.sayHi();
運行效果:
案例補充說明:
1)var bar = new Bar("Lin",18,"male"); 解釋: new 一個 Bar對象,名為bar. bar就繼承了Foo類的屬性和Foo原型上的方法。 2)bar.sayHi(); //可調 解釋: bar對象,首先自身查找是否有sayHi()方法,沒有則bar.__proto__得到Bar.prototype; 在Bar.prototype這個原型對象中繼續(xù)查找,而前面我們已指定Bar.prototype = new Foo(); 則意味著是在Foo對象中查找,然而Foo對象本身沒有sayHi()方法; 則調用(new Foo()).__proto__得到原型對象Foo.prototype; 繼續(xù)在該原型對象Foo.prototype中查找sayHi()方法; 終于找到了!??!返回結果吧。 擴展: 如果依然沒找到,就會Foo.prototype.__proto__得到Object.prototype, Object.prototype本身沒有sayHi()方法,就會 Object.prototype.__proto__得到null. null是最頂級的對象。在該對象中,查無此方法,就報錯了;查無此屬性,就undefined.
涉及術語:
原型鏈 各構造函數(shù),各有與之相對應的原型; 類之間的繼承,就暗暗的把原型間的關系統(tǒng)籌在了一起。 頂層原型上方法或屬性的查找過程,就是依靠著原型間的這種關系,一層一層的向上查找的。 原型繼承 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)象式總結: 僅是原型繼承,子類Bar確實可調用(父類Foo的屬性和原型上的方法)了,但實例化出來的Bar對象就不獨立了。意味著某個對象對Foo構造函數(shù)中的屬性或方法的修改,會影響到其他對象調用的結果. 簡言之,子類可調父類了,但是實例化的對象不獨立。 僅是借用繼承,子類bar實例化的對象是獨立的,對象間不受影響,但父類原型上的方法調不了了. 推薦組合繼承,既保證了對象間的獨立性,又能調用到父類的原型上的方法。
福利:
1.原型鏈圖示(網上找的,看懂即可跳過上述內容)
該圖把原型和構造函數(shù)間的關系理的很清楚,可在Google瀏覽器的console運行demo并查看對象下原型間的關系。
2.JS高級部分,之前看的是ali的Bosn的JavaScript深入淺出
如有不適內容,歡迎指正。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/91809.html
摘要:注本文內容來深入面向對象模式與實踐中節(jié)。面向對象設計與過程式編程面向對象設計和過程式編程有什么不同呢可能有些人認為最大的不同在于面向對象編程中包含對象。面向對象編程和過程式編程的一個核心區(qū)別是如何分配職責。 注:本文內容來中6.2節(jié)。 6.2 面向對象設計與過程式編程 ??面向對象設計和過程式編程有什么不同呢?可能有些人認為最大的不同在于面向對象編程中包含對象。事實上,這種說法不準確。...
摘要:聲明式編程一種編程范式,與命令式編程相對立。常見的聲明式編程語言有數(shù)據庫查詢語言,正則表達式邏輯編程函數(shù)式編程組態(tài)管理系統(tǒng)等。函數(shù)式編程,特別是純函數(shù)式編程,嘗試最小化狀態(tài)帶來的副作用,因此被認為是聲明式的。 編程范式與函數(shù)式編程 一、編程范式的分類 常見的編程范式有:函數(shù)式編程、程序編程、面向對象編程、指令式編程等。在面向對象編程的世界,程序是一系列相互作用(方法)的對象(Class...
摘要:為什么要采用面向對象編程解決問題更容易設計計算機程序就是為了解決人類的問題。面向對象編程需要對業(yè)務及代碼的架構是有一定的要求的。 1. 編程方式 我們目前的編程方式大體可以有以下三種編程方式: 順序編程 過程式編程 面向對象編程 在講面向對象編程時先講一下什么是順序編程,什么是過程式編程,什么是面向對象編程: 順序編程: 就是只用一個單線程去執(zhí)行一段代碼,執(zhí)行過程根據代碼依次從上...
摘要:參考鏈接面向對象編程模型現(xiàn)在的很多編程語言基本都具有面向對象的思想,比如等等,而面向對象的主要思想對象,類,繼承,封裝,多態(tài)比較容易理解,這里就不多多描述了。 前言 在我們的日常日發(fā)和學習生活中會常常遇到一些名詞,比如 命令式編程模型,聲明式編程模型,xxx語言是面向對象的等等,這個編程模型到處可見,但是始終搞不清是什么?什么語言又是什么編程模型,當你新接觸一門語言的時候,有些問題是需...
閱讀 2845·2021-11-19 11:30
閱讀 3110·2021-11-15 11:39
閱讀 1884·2021-08-03 14:03
閱讀 2056·2019-08-30 14:18
閱讀 2110·2019-08-30 11:16
閱讀 2269·2019-08-29 17:23
閱讀 2660·2019-08-28 18:06
閱讀 2598·2019-08-26 12:22