JavaScript - 如何在对象定义中定义属性

时间:2014-09-30 13:19:53

标签: javascript constructor prototype getter

如何在对象定义中定义属性,以便在构造函数中使用它?

例如: 当我在命名空间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;
};

2 个答案:

答案 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;如果xPos0,则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属性,静态成员仍然成为该函数的属性,依此类推。