iT邦幫忙

0

[進階問題] jQuery Plugin 怎麼繼承另一個Plugin,做到Overload (多載) 與 Override (覆寫) ?

如題~

看更多先前的討論...收起先前的討論...
石頭 iT邦高手 1 級 ‧ 2018-03-16 09:58:03 檢舉
不懂你的問題 可給多點描述?
其實已經很清楚了,不知道哪裡不懂? B plugin 繼承 A plugin (類似java 的繼承概念)
ccutmis iT邦高手 2 級 ‧ 2018-03-16 10:25:37 檢舉
https://stackoverflow.com/questions/20621006/override-jquery-plugin-methods
fillano iT邦超人 1 級 ‧ 2018-03-16 11:22:24 檢舉
一般寫plugin的人,並不會想到讓使用者「繼承」,所以並不容易...究竟Javascript不是一個純物件導向的語言。通常寫的有彈性的,只是讓你可以把options傳進去,讓一些功能可以自訂。
fillano iT邦超人 1 級 ‧ 2018-03-16 11:32:21 檢舉
另外,jQuery的plugin,其實要類比的話,比較像一個jQuery的「方法」,並不是類別,你很難重用的。
這就是問題所在,該說是設計爛嗎?plugin的擴充性不足,讓jQuery的發展受到了侷限,與其用一堆亂七八糟的框架,還不如把這部份做完整,半調子的做法真是不知道是聰明還是笨~
不要把javascript當做是class會比較好喔。
說真的,jquery的plugin,並沒辦法有所謂的繼承性。但可以直接呼叫取用。
可是它並沒辦法像class一樣。可以多物件同時應用。

但山不轉路轉的情況下。就是自已搞一個元件來做繼承處理就行了。
只要再多加一個plus的判斷就行了。

操作方式跟java會有點不太一樣。因為javascript的運做原理比較不同。
現在沒有一種設計能不用oo設計了吧~
wolfwang iT邦研究生 4 級 ‧ 2018-03-16 12:09:25 檢舉
如果 JS 不需要用 Overload (多載) 與 Override (覆寫) 一樣可以解決問題,那就不一定要用 Overload/ Override ,所以你有具體的問題需要解決,還是只是要做抽象的討論?

程式的世界也不是只有 OO
比起解決問題,更重要是尋求較佳的解決方式,oo當然不是唯一的方式,卻是較佳的方式
石頭 iT邦高手 1 級 ‧ 2018-03-16 13:17:43 檢舉
更重要是尋求較佳的解決方式 你說的對
但你連程式碼都沒有 要怎麼解決?
石頭 iT邦高手 1 級 ‧ 2018-03-16 13:17:43 檢舉
你嘗試過什麼?找過什麼資料?
只貼了一個 jQuery Plugin 怎麼繼承另一個Plugin,做到Overload (多載) 與 Override (覆寫) 就想要答案??
fillano iT邦超人 1 級 ‧ 2018-03-16 13:34:01 檢舉
ㄝ,不要把jQuery想的那麼偉大,他要解決的問題並不是非OO不可。jQuery的功能非常簡單,簡單到可以說他只做一件事,就是找到你要找的DOM物件,把他包裝成jQuery物件的instance,讓你可以很方便地操作DOM物件。大致上就這樣而已。plugin是擴充他的方法,其實只是非常簡單的介面,讓你在jQuery.prototype加上可以使用的方法,在這個方法內,透過this就可以取得jQuery物件。沒了。因為這裡所謂的plugin,其實只是一個jQuery的方法,你能做的事情頂多只是把他換掉。他不是類別。世界上並不是只有jQuery,有其他支援更多物件導向特性的library,但是jQuery用的人多...
ccutmis iT邦高手 2 級 ‧ 2018-03-16 13:45:32 檢舉
扯個題外話 javascript是弱型別語言,了解語言特性,比較不會產生偏見。使用OO跟建構OO是兩件差異極大的事情,例如大家都會 var myArr=new Array(1,2,3....); 但能寫出Array Override的人不多(我指不用查stackoverflow就能辦到的),總之...能寫myArr=new Array並解決問題就行了
比起其他笨重的lib,光是成為主流這點,jQuery還真的蠻偉大的,的確使用OO跟建構OO是兩件差異極大的事情,但建構的好與不好,必須從使用者的角度去考量,有太多賣弄技術卻忽略了最重要目的去設計,雖然js不是完全的oo程式,但很多js framework設計還是用oo的方式去設計,也正因為oo有著相當完整的設計概念,這是個概念性的問題,也嘗試過不少做法,不過不盡理想,只是想知道有沒有更好設計方式罷了。
fillano iT邦超人 1 級 ‧ 2018-03-16 15:21:19 檢舉
這裡面其實牽涉到三個角色:jQuery、plugin作者、一般使用者。讓他蔚為風潮的是第三個,如果叫他們考慮OO,我想不會有這麼多人用XD...我從來不認為jQuery架構有多好,但是不少架構漂亮的東西都...
所以前兩者應該把oo的架構做好,讓一些進階應用也能使用jQuery,而且如果第一個角色規劃的不好,一般使用者也不會想用吧,這是個供需問題,過度封裝是件很瞎的事~
froce iT邦大師 1 級 ‧ 2018-03-16 15:37:45 檢舉
jQuery 從來就只是讓你開發方便啊。
不用考慮舊ie的話,jQuery 沒什麼必要性。
基本上 jQuery 就是 javascript 的語法糖,然後可以幫你避開一些舊IE的坑,這樣而已。
然後你希望一個2006年的框架,把當時 javascript 很難做到的事做好,好像有點強人所難吧?

現在前端一堆框架,選一個你覺得有愛的就好。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

6
暐翰
iT邦大師 1 級 ‧ 2018-03-16 14:01:02

回答:

可以使用typescript
以下先要懂的概念,就可以延伸應用去解決你的問題


#為什麼使用typescript,而不使用原生的javascript

因為物件化概念是給人為了"寫Code"使用的 -> 使用typescript因為多了"編譯動作",所以才能像Java、C#良好的支持物件導向概念 : 編譯前報錯,繼承,Override...等

舉例:

(圖-1) 藉由參數來Overload
(圖-2) 方法名稱、參數一樣,就可以Override


# typescript編譯完就是js檔案

所以想要Javascript寫物件導向也是可以
(別人怎麼想我是不知道,我是沒那麼勤奮就是了XD)

舉例:


以上概念搞懂了,要解決你的問題

1.先去下載Jquery的lib:jquery Typescript

2.配合上面概念,使用介面跟實作就可以達到你要的


我寫的範例

class 人 {
    _身高: number;
    _名字: string;
    constructor() {

    }
    說話() {
        return `我是一個人,名字:${this._名字} 身高: ${this._身高} `;
    }
}

class 台灣人 extends 人{
    _台灣身分證: string;
    constructor(名字: string, 身高: number, 台灣身分證: string) {
        super();
        this._名字 = 名字;
        this._身高 = 身高;
        this._台灣身分證 = 台灣身分證;
    }
    說話() {
        return `我是一個台灣人,名字:${this._名字} 身高: ${this._身高} 
            , 另外身分證號: ${this._台灣身分證}`;
    }
}

let taiwan_person: 人 = new 台灣人("暐翰",174,"E124XXXXXXX");
console.log(taiwan_person);
alert(taiwan_person.說話());

附註:

Typescript其他概念這邊就不細講(會講不完),網路上很多資源可以找,需要自己去學習 :)

因為效能問題吧~

暐翰 iT邦大師 1 級 ‧ 2018-03-16 14:44:58 檢舉

因為效能問題吧~

不懂 是說typescript效能問題嗎?
效能就類似C跟java差別,不會因為java效能輸C就不去用java : )

我要發表回答

立即登入回答