爲什麼不乾脆:
var point2D = function (x, y) {
return { x : x,
y : y };
},
point3D = function (x, y, z) {
return { x : x,
y : y,
z : z };
};
...當你有這些特定的建築塊作爲基本元素,構成其使用它們不同的模塊?
編輯
function anObj (x, y) {
var privateFunc = function() { return y; };
return {
x : x,
method : function() { return privateFunc(); }
};
}
var myObj = anObj(1, 2);
myObj.x; // 1
myObj.method(); // 2
這裏的好處是,你現在得到私有變量(privateFunc
和y
)。
不足之處在於,就內存使用情況而言,您的對象的每個實例都需要擁有其所有私有方法副本的OWN副本。
所以,如果你正在做成千上萬的這些對象(頂點/多邊形,例如),他們不NEED有私有狀態,這是不使用的方法。
但是,如果你讓玩家或敵人,或控制器,或任何你切勿想篡改,那麼你要使用這樣的(或更高級)的方法。
如果你有一個情況下,你可能想STATIC數據/方法這也是100%的私有,那麼你應該嘗試這樣的格式:
var objectMaker = (function() {
var staticData = 32,
staticFunc = function (num) { return num + staticData; };
return function (x, y) {
var privateData = 12,
privateMethod = function (num) {
return y + privateData + staticFunc(num);
};
return { x : x,
method : function (num) { return privateMethod(num); }
};
};
}());
var myObj = objectMaker(3, 4);
myObj.x; // 3;
myObj.method(12); // 12 + y(y === 4) + privateData + staticData;
所以我們做了什麼這裏是我們有一個立即觸發功能(只要定義它就會觸發,並將函數的值返回給變量)。
因此,在我們的特殊情況下,該函數立即返回我們想要用來創建新實例的實際的函數。
私有變量,是直接作用(不是我們返回構造函數)的內部功能是靜態的,在您創建將有關閉內獲得完全一樣的功能/數據每個實例。
不足之處在於那些靜態函數有訪問私有數據(甚至是特定於實例的數據)的訪問權限。
這意味着您必須將您的值傳遞給靜態函數,並捕獲靜態函數的返回值,因爲您不能依賴靜態方法來修改實例值(從技術上講,您可以直接修改對象/數組如果你將它們傳遞給函數,否則你必須捕獲返回值)。
現在,您可以擁有大量幫助程序功能,這些功能在實例(較低內存)之間共享,同時仍然是私密和安全的。
如果你想要的是公共屬性,公共方法,和靜態方法/屬性,那麼你可以像這樣訪問他們:
var Obj = function (x, y) {
this.x = x;
this.per_instance_method = function() { return y; };
};
Obj.prototype.staticData = { z : 32 };
Obj.prototype.staticMethod = function() { return this.x + this.staticData.z; };
var myObj = new Obj(3, 4);
myObj.staticMethod();
...只是不要指望任何原型的方法來訪問到任何實例的私人數據(如y
)。
我不喜歡你的方法,或者至少不是你的具體樣品中,因爲它違反了基本原則:一個「verctor 3D」是不是「矢量2D」。我認爲你所看到的是參數化 – jodarove