我試圖確定一些JavaScript的性能影響。在我們的應用程序中,表單包含許多小部件。並非所有小部件都用於每個頁面,或者小部件可能會多次使用。我一直在思考類似以下的模型(請注意,實際的腳本是一個複雜得多,我已經簡化它是短暫的):在需要時創建JavaScript函數
var widget = {
type1: function(args) {
function getName() {
return this._name;
}
return (widget.type1 = function(args) {
return {
_name: args.name,
getName: getName
};
})(args);
}
}
我的想法是,第一次widget.type1
函數被調用,它將初始化widget.type1所需的所有代碼。任何後續的widget.type1將使用這些函數。我知道我可以做這樣的事情:
var widget = {
type1: function(args) {
return {
_name: args.name,
getName: function getName() {
return this._name;
}
};
}
}
但隨後各TYPE1對象有它是做同樣的事情,我會假設會使用更多的內存功能的自己的副本(我已經測試過瀏覽器調試工具,即o1.getName!= o2.getName)。
我可以寫出當前頁面上來自服務器的小部件類型的腳本,但是我沒有從緩存單個js文件中受益,也不希望將每個小部件放入它自己的js文件,因爲那樣它將不得不單獨下載它們。
這會導致問題嗎?我認爲這樣做會/應該這樣嗎?其他想法?
編輯
我想我應該解釋一下我的推理。我的想法(可能是錯誤的)是,第一次使用小部件時,它會初始化小部件使用的邏輯。例如,如果我從來沒有創建一個type1小部件,則不需要爲type1小部件的原型添加一堆函數。我寫的代碼是高度簡化。這個小部件可能會有500多行代碼,我實際上並沒有使用getName函數,這只是一個例子。如果這個小部件沒有被使用,它根本就不需要這個邏輯。它還保持該部件僅在全局範圍外使用的功能。
我目前使用的對象和功能添加到該對象(例如MyType.prototype.whatever = function(){ ... }
)的原型,但一想到發生,我認爲,如果我從來沒有創建MyType
對象,爲什麼還要初始化的MyType
原型?
另一種方法來做我在想什麼,這次使用對象原型(再次,可能有300個函數添加到type1的原型。我問的想法是,如果它有任何意義,繼續前進,把它們添加到TYPE1的原型如果從未創建TYPE1):
var widget = {
_type1Init: function()
{
widget.type1.prototype.getName = function() {
return this._name;
}
widget._type1Init = function(){} //So calling again won't do anything.
},
type1: function(args) {
widget._type1Init();
this._name = args.name;
}
}
if(*someCondition*)
var obj = new widget.type1({ name: "hello world" }); // If an object is created, it gets initilized, otherwise it won't.
第二段代碼更好。你應該意識到你將會在這兩種情況下創建一個包裝'_name'的函數,但是在第二個函數中你有一個不需要的seaf,它不會完成任何事情(只要你做'widget.type1',你的'getName'幫助器就會被創建' – megawac
如果你想要基於實例的代碼,你應該考慮構造函數,或者'Object.create()'和它的向後兼容的對象。 – PHPglue
計算機有千兆字節的內存,擔心幾個字節是不值得的。並且易於維護更具價值。如果要在對象之間共享方法,請使用原型繼承。 – RobG