日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript OOP(下)(九)

發布時間:2025/3/8 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript OOP(下)(九) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、javascript模擬重載

java中根據參數類型和數量的區別來實現重載,javascript弱類型,沒有直接的機制實現重載,javascript中參數類型不確定和參數個數任意,通過判斷實際傳入的參數的個數來實現重載。

<script> function Person() {var args = arguments;if (typeof args[0] === 'object' && args[0]) { //判斷第一個參數是否為對象,進行相應操作。傳參為空時typeof null也是object,所以要同時判斷args[0]不為空if (args[0].name) {this.name = args[0].name;}if (args[0].age) {this.age = args[0].age;}} else {if (args[0]) {this.name = args[0];}if (args[1]) {this.age = args[1];}} }
//toString繼承自Object,一般的對象toString會顯示"[object Object]",沒有什么意義,所以可以重新一下,方便輸出 Person.prototype.toString
= function() {return 'name=' + this.name + ',age=' + this.age; }var bosn = new Person('Bosn', 27); bosn.toString(); //name=Bosn,age=27var lxy = new Person({name: 'lxy',age: 25 }); lxy.toString(); //name=lxy,age=25 </script>

二、調用基類方法

1、調用基類的方法進行初始化

基類人Person

學生Student

初始化Student的時候,初始化了className后需要初始化Person部分,可以通過

Person.call(this,name);調用基類的方法和屬性。

<script> function Person(name){this.name=name; } function Student(name,className){this.className=className;Person.call(this,name); //調用基類的構造器 }var bosn=new Student('Bosn','Network064'); console.log(bosn); </script>

輸出時能夠正確的被初始化。

2、子類覆蓋了基類的方法

Student的init覆蓋了Person的init,初始化Student時需要初始化Person,通過Person.prototype.init.apply(this,arguments);

<script> Person.prototype.init=function(){};Student.prototype.init=function(){//do sthPerson.prototype.init.apply(this,arguments); } </script>

三、鏈式調用

?類似jquery選擇器鏈式調用。

關鍵要在ClassManager.prototype.addClass操作完成后return this

<script> function ClassManager(){//構造器 }ClassManager.prototype.addClass=function(str){ //在構造器上掛載一個方法,表示addClass console.log('Class:'+str+' added.'); return this;// this總是指向ClassManager的實例,所以return就實現了鏈式調用 }var manager=new ClassManager(); manager.addClass('classA').addClass('classB').addClass('classC'); //Class:classA added. //Class:classB added. //Class:classC added.</script>

四、抽象類

?沒有機制,可以進行模擬。主要是用throw new Error()

<script> function DetectorBase(){throw new Error('Abstract class can not be invoked directly!');//在構造器里拋一個異常,防止抽象類被直接調用 } DetectorBase.detect=function(){console.log('Detection starting...');} DetectorBase.stop=function(){console.log('Detector stopped.');} DetectorBase.init=function(){throw new Error('Error');//想要子類覆蓋而不想被直接調用的方法,拋出異常 }function LinkDetector(){} //通過Object.create實現繼承 LinkDetector.prototype=Object.create(DetectorBase.prototype); LinkDetector.prototype.constructor=LinkDetector; </script>

五、definePrototype(ES5)

?

<script> //ES5里面對于屬性有一些getter setter方法,有一些標簽 //configurable:能否delete //enumberable:能否for in遍歷 //writable:能否讀寫屬性 //value:記錄屬性值,默認為undefine //控制屬性的訪問情況function Person(name){//name可遍歷,不可讀寫,不可刪除Object.defineProperty(this,'name',{value:name,enumerable:true}); } //ARMS_NUM相當于定義了一個常量,可枚舉,不可寫,不可刪除 Object.defineProperty(Person,'ARMS_NUM',{value:2,enumerable:true}); Object.seal(Person.prototype); //Person在初始化之后不想被擴展,不想被配置了,用seal方法 Object.seal(Person);function Student(name,className){this.className=className;Person.call(this,name); } Student.prototype=Object.create(Person.prototype); Student.prototype.constructor=Student; </script>

六、模塊化

模塊化工具或者說類庫有有seajs,requirejs等。

模塊化的一般形式是:一個定義了私有變量和函數的函數;利用閉包創建可以訪問私有變量和函數的特權函數;最后返回這個特權函數,或者把它們保存到一個可訪問到的地方。

1、通過返回一個對象實現簡單模塊化

<script> var moduleA;//只需要把最核心的東西moduleA放到全局作用域 moduleA=function(){var prop=1;function func(){}return{ //func和prop不會被泄露到全局作用域 func:func,prop:prop} }() //moduleA用立即執行的匿名函數 </script>

2、通過返回this的方法實現簡單模塊化

通過new function(),通過設置this的值,我們知道通過new調用最后會返回this,除非你return的是一個對象。

<script> //通過new默認返回this的方法 va moduleA; moduleA=new function(){var prop=1;function func(){}this.func=func;this.prop=prop; } </script>

3、模塊化應用【update20170307】

模塊化可以摒棄全局變量的使用。促進了信息隱藏和其他優秀的設計實踐。對于應用程序的封裝,或者構造其他單例對象,模塊模式非常有效。

模塊模式也可以用來產生安全的對象。

例:構造一個用來產生序列號的對象。

<script> var serial_maker=function(){ /*返回一個用來產生唯一字符串的對象。 唯一字符串由兩部分組成:前綴+序列號。 該對象包含一個設置前綴的方法,一個設置序列號的方法和一個產生唯一字符串的gensym方法。 */ var prefix=''; var seq=0; return{set_prefix:function(p){prefix=String(p);},set_seq:function(s){seq=s;},gensym:function(){var result=prefix+seq;seq+=1;return result;} } }; var seqer=serial_maker(); seqer.set_prefix('Q'); seqer.set_seq(1000); var unique; unique=seqer.gensym(); console.log(unique);//unique是"Q1000" unique=seqer.gensym(); console.log(unique);//unique是"Q1001"</script>

seqer()的3個方法都沒有用到this或者that,因此沒有辦法損害seqer。除非調用對應的方法,否則沒法改變prefix或seq的值。

seqer對象是可變的,所以它的方法可能會被替換掉,但替換后的方法依然不能訪問私有變量。

比如:

seqer.gensym=function(){var result=prefix+seq;seq+=3;console.log(seq);return result; }

就會報錯,因為替換后的方法不能訪問私有變量。

seqer就是一組函數的集合,而且那些函數被授予特權,擁有使用或修改私有狀態的能力。

如果我們把seqer.gensym作為一個值傳遞給第三方函數,那個函數能用它產生唯一字符串,卻不能通過修改它來改變prefix或seq的值。

參考:

js模塊化歷程

http://www.cnblogs.com/lvdabao/p/js-modules-develop.html

寫了十年JS卻不知道模塊化為何物?

https://blog.wilddog.com/?p=587

?深入淺出ES6(十三):類 Class

http://www.infoq.com/cn/articles/es6-in-depth-classes/

?

本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載注明出處:http://www.cnblogs.com/starof/p/4904929.html有問題歡迎與我討論,共同進步。

總結

以上是生活随笔為你收集整理的javascript OOP(下)(九)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。