2016-01-25 55 views
1

我有一個View類有一個構造方法initialize我認爲這是一個構造方法,糾正我,如果錯了。Javascript如何重寫構造方法?

var View = function(obj) { 
    this.initalize = obj.initalize; 
}; 

我想實現的是當類被實例化時被調用的東西。

我該如何傳遞一個對象?

var chatView = new View({ 
    initialize: function() { 
     alert('Yay for initialization'); 
    } 
}); 

這樣當我實例化View我可以將對象傳遞給構造函數和中的一個關鍵initialize哪個值的函數,並且實例化時該鍵具體被調用。

+1

[爲什麼不可能改變構造的可能的複製函數原型?](http://stackoverflow.com/questions/9267157/why-is-it-impossible-to-change-constructor-function-from-prototype) – AMACB

+1

'obj.initalize()'? – Oriol

+0

*我想實現的是在類實例化時調用的東西。*然後調用它。 –

回答

2

如果我得到它的權利,有獲得你想要的東西的簡單方法:

var View = function(obj) { 
    obj.initialize(); 
} 

這樣,當你創建一個視圖類初始化函數被調用。

請注意,如果你想要做真正的「初始化代碼」初始化函數內的工作,你可以使用call(或apply):

var View = function(obj) { 
    if (typeof obj.initialize === 'function') { 
     obj.initialize.call(this); 
    } 
} 

var chatView = new View({ 
    initialize: function() { 
     this.property = 'property'; 
    } 
}); 

console.log(chatView.property); // outputs property 
+0

似乎合法,讓我試試看。我注意到backbone.js和'call()'類似。我需要調查它做了什麼。 –

+0

甜美的男人謝謝。我應該知道什麼使用這個?爲什麼'_.extend()'會給我帶來好處? –

+1

我不是_庫的用戶,但我會說,如果你真的想要使用這個「自定義初始化」的概念,你可以在調用它之前檢查'obj'中'initialize'方法的可用性, 'View'類更健壯(我將進行編輯)。 – Samuel

0

Javascript沒有構造函數,請記住javascript基於原型。這是「構造」的一個例子,你可以創建

function Example (firstname, lastname) { 
this.firstname = firstname; 
this.lastname = lastname; 
} 

Example.prototype.getFullname = function() { 
return this.firstname + ' ' + this.lastname; 
} 

如果你想創建一個構造函數,你必須調用它實例化功能之後。

但是,這是一個更好的結構,你可以使用。我只推薦你需要構造函數和私有函數。否則,用原型聲明的方法使用簡單的結構,可以獲得更好的性能。

var MyObject = (function() { 

    // Constructor 
    function MyObject (foo) { 
     this._foo = foo; 
    } 

    function privateFun (prefix) { 
     return prefix + this._foo; 
    } 

    MyObject.prototype.publicFun = function() { 
     return privateFun.call(this, '>>'); 
    } 

    return MyObject; 
})(); 


var myObject = new MyObject('bar'); 

有了這段代碼,你有一個構造函數,但它是一個「私有」函數,所以在實例化對象後你不能覆蓋它。

在這裏,我有一個鏈接,我創建測試型動物結構: https://plnkr.co/edit/qzgWVZlnIFnWl0MoUe5n?p=preview

結果:

測試1:〜15K(私人功能) - 僅建議,如果你想/需要一個私人函數

測試2:〜38k(帶私有函數) - 不推薦,它返回一個非常糟糕的對象。

測試3:〜8K(沒有私有函數) - 推薦,它具有最佳的性能,但是你不能創建一個私有函數,這意味着,任何人都可以調用任何功能:S