创建一个javascript对象来模拟一个类和静态方法?

时间:2009-12-18 12:46:01

标签: javascript oop prototype

有人可以帮忙吗?我在javascript中有以下对象...据我所知,我的日历中的每个“INSTANCE”都有自己的变量。

我的问题是我需要插入一个名为“InitilizeHolidays”的方法/函数名称,这需要添加到一个数组中,但所有实例中的细节都需要相同...我正在考虑某种STATIC方法调用if这是可能的..

当然,如果我在“原型”上插入它,它将特定于每个实例,我需要它来影响所有实例。

是否可以初始化影响所有实例和仅特定实例的变量?我必须在哪里插入这些?

任何帮助真的很感激

function Calendar() {
    // I presume variables set here are available to "ALL" instances

}

Calendar.prototype = {
    constructor: Calendar,
    getDateTest: function() {
        return "date test";
    },
    getDateTest2: function() {
        return "date test";
    }
};

3 个答案:

答案 0 :(得分:2)

是的,有可能。在yui他们使用

YAHOO.lang.augementObject(Calendar,{/* Properties go here*/});

但如果您不使用YUI,为了简化您可以这样做

Calendar.MyStaticVar = {/* Any variables you want*/}

这将允许您定义一个名为MyStaticVar的静态变量,在此示例中,它是一个对象,但它可以是一个字符串,一个数字,无论您想要什么。然后使用它,你所要做的就是去

Calendar.MyStaticVar

YUI中的Augment对象非常好,因为你可以说

YAHOO.lang.augementObject(Calendar,{
   StaticVar1:'somevalue',
   StaticVar2:{/*Object value*/},
   StaticVar3:393,
   SomeStaticFunction:function() {}
});

相反
Calendar.StaticVar1 = 'somevalue';
Calendar.StaticVar2 = {/*Object value*/};
Calendar.StaticVar3 = 393;
Calendar.SomeStaticFunction = function() {};

答案 1 :(得分:2)

Javascript的原型继承令人困惑。让我解释一下。

原型对象中定义的字段所有实例共享。问题是你无法真正注意到,因为分配到对象o的字段总是在o实例而不是在原型上执行。

因此,您有两种选择来定义静态字段。

(1)在原型对象上定义一个字段。当你想要改变它时,你必须通过原型对象来改变它。

  function Calendar() {
  }

  Calendar.prototype = {
     constructor: Calendar,
     y: 'y',
  };

  function go()
  {
     var c1 = new Calendar();
     var c2 = new Calendar();

     alert("c1.y=" + c1.y + " c2.y=" + c2.y);

     // now setting y to 'YYYYY';
     Calendar.prototype.y = 'YYYYY';

     // both c1 and c2 'see' the new y value
     alert("c1.y=" + c1.y + " c2.y=" + c2.y);  
  }

这样做的危险是您可能会意外地尝试通过其中一个实例设置y字段,如:c1.y = 5555,在这种情况下,赋值将发生在c1对象上但不会发生在c2对象上

因此,您可以使用更安全的第二个选项,但需要更多按键...

(2)使用Javascript的封装技巧确保原型字段只能通过getter和setter方法来实现。

  function Calendar() {
  }

  function initCalendarPrototype()
  {
     var y = 'y';
     Calendar.prototype = {
         constructor: Calendar,             
         getY: function() { return y; },             
         setY: function(arg) { y = arg; },                    
     };
  }

  function go()
  {
     initCalendarPrototype();

     alert("c1.getY()=" + c1.getY() + " c2.getY()=" + c2.getY());

     // now setting y to 'YYYYY' via setY()
     // Can be invoked on either c1, c2 or Calendar.prototype
     c1.setY('YYYYY') 

     // both c1 and c2 'see' the new y value
     alert("c1.getY()=" + c1.getY() + " c2.getY()=" + c2.getY());
  }

答案 2 :(得分:0)

好吧,我认为静态属性不适合你。 考虑一下:

function MyClass(specialProp) {
    if (specialProp) {
        this.prop = specialProp;
    }
}
MyClass.prototype = {"prop":"defaultValue"};
var foo = new MyClass("changed"), bar = new MyClass();
alert(bar.prop);  //got the property from the prototype chain
alert(foo.prop);  //special property of the instance