有人可以帮忙吗?我在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";
}
};
答案 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