如何在对象定义中定义属性,以便在构造函数中使用它?
例如: 当我在命名空间WindowManager中使用属性'x'和'y'定义一个对象Window时,我想使用WindowManager.Window.DEFAULT_X和WindowManager.Window.DEFAULT_Y来处理构造函数中的undefined / null参数。像这样:
var WindowManager = {
Window: {
get DEFAULT_X () {
return 0;
},
get DEFAULT_Y () {
return 0;
},
constructor: function Window (xPos, yPos) {
this.x = xPos || WindowManager.Window.DEFAULT_X;
this.y = yPos || WindowManager.Window.DEFAULT_Y;
},
prototype: {
x: undefined,
y: undefined
}
}
};
WindowManager.Window = WindowManager.Window.constructor;
我将如何更改代码,以便在构造函数中使用这些“静态”属性并保持一些优雅的代码?
我不希望我的代码看起来像这样:
WindowManager.Window.__defineGetter__ ("DEFAULT_X", function getDEFAULT_X () {
return 0;
});
// ...
WindowManager.Window.constructor = function Window (xPos, yPos) {
this.x = xPos || WindowManager.Window.DEFAULT_X;
this.y = yPos || WindowManager.Window.DEFAULT_Y;
};
答案 0 :(得分:0)
最好的方法是使用闭包
var Window;
(function() {
var DEFAULT_X= 100;
var DEFAULT_Y= 100;
Window= function (x, y) {
if (typeof x === "undefined" || x === null)
this.x= DEFAULT_X;
else
this.x = x;
if (typeof y === "undefined" || y === null)
this.y= DEFAULT_Y;
else
this.y = y;
}
}());
WindowManager= {
window: new Window(10, 20)
};
此模式称为Immediately-invoked function expression,用于隐藏外部范围内的变量。这样,DEFAULT_X和DEFAULT_Y仅在Window构造函数中可见。
this.x = xPos || WindowManager.Window.DEFAULT_X;
如果xPos
为0
,则this.x
将采用默认值,通常最好手动测试undefined
和{{1} }:null
。
答案 1 :(得分:0)
在JavaScript(不计算ECMAScript 6)中,构造函数是对象定义。要使用与静态属性等效的东西,您可以将它们附加到函数本身,而不是函数的prototype
属性。在您的情况下,它可能看起来像这样:
var WindowManager = {};
// Define the Window object.
// NOTE: This function has a bug, because if DEFAULT_X and DEFAULT_Y
// are not zero, then it will be impossible to set a window to (0,0).
// I have kept the code as-is, to show how it corresponds to the example
// you provided.
function Window(xPos, yPos) {
this.xPos = xPos || Window.DEFAULT_X;
this.yPos = yPos || Window.DEFAULT_Y;
}
// Static properties of Window.
Window.DEFAULT_X = 0;
Window.DEFAULT_Y = 0;
WindowManager.Window = Window;
通过引入类定义的语法,ECMAScript 6会稍微改变一下。但是,正如我目前所定义的那样,语法基本上就是我上面所做的。 ECMAScript 6仍然定义了一个像这样的构造函数,非静态成员转到该函数的prototype
属性,静态成员仍然成为该函数的属性,依此类推。