2015-08-20 158 views
1

我到處尋找,似乎並沒有任何問題,更不用說在那裏回答這個問題。有沒有辦法繼承/繼承/擴展javascript WebSocket?

我試過多種方式,並使用原型繼承好像這將是

function MyWebSocket(url) { 
    // do other stuff 
    WebSocket.call(this, url); 
} 

MyWebSocket.prototype = Object.create(WebSocket.prototype); 
MyWebSocket.prototype.constructor = MyWebSocket; 
MyWebSocket.prototype.test = function() { alert('hi'); }; 

我可以指定測試功能單獨就好了最好的方式,但在試圖覆蓋consutructor我得到的錯誤「 TypeError:無法構造'WebSocket':請使用'new'運算符,這個DOM對象構造函數不能作爲一個函數「從chrome調用。

我知道這不是典型的JavaScript函數/對象,但我真的很喜歡重寫WebSocket構造函數來設置其他維護功能,如ping間隔和是的,我可以在onopen中單獨執行此操作函數,但這是我想要在網站上打開的所有WebSocket的全局。

謝謝大家!

+1

那麼,你必須在構造函數中構建一個WebSocket的實例。現在你有了一個選擇:將它聚合爲一個屬性,並通過適配器使用它,或者使用像Object.setPrototypeOf(這個.__ proto__,新的WebSocket(url));''。請注意Safari不支持後者。 – raina77ow

+0

實際上,最好寫成Object.setPrototypeOf(Object.getPrototypeOf(this),new WebSocket(url))'。 – raina77ow

+0

我希望第二種方法能夠工作,但這會導致匿名函數(如事件函數的getter/setter)沒有綁定到WebSocket的問題,所以Chrome會拋出非法調用,並且Firefox會拋出「TypeError:'onmessage'setter調用on沒有實現接口的對象WebSocket「 – JSous

回答

2

類似以下內容可以爲你工作:

function MyWebSocket(url) { 
    this.ws = new WebSocket(url); 

} 

MyWebSocket.prototype.test = (function() { 
    // this = MyWebSocket.ws, i.e. a plain WebSocket obj 
}).bind(MyWebSocket.ws); 

var myWS = new MyWebSocket(url); 
myWS.test(); // does something to the underlying websocket 

或者交替,做一些底層的WebSocket,你不能使用bind和定義上MyWebSocket.prototype的職能時,而不是僅僅指this.ws

+0

是的,但是測試函數按照我自己的想法工作。這是我想重寫的構造函數。 – JSous

+0

這很接近我最終做的事,謝謝你的幫助 – JSous