我试图找出是否有一种方法可以在其原型中将对象属性定义为动态值,该值可以在每次创建对象实例时更改。这是我描述它的最好方式。我做了一个小提琴,以显示我要做什么(尽管它不起作用)。

var Response = {
    LCID: 321
};


Date.prototype.LCID = Number(0);
Date.prototype.LCID.valueOf = function() { return Response.LCID; };


document.write((new Date()).LCID);
Response.LCID = 456;
document.write((new Date()).LCID);


http://jsfiddle.net/tx2fW/2/

我试图实现的是Response.LCID可以在代码的整个生命周期内发生变化,正如您稍后从我看到的那样,可以看到在其代码中更改其值。每当我创建Date对象时,我都希望(new Date()).LCID的值是Response.LCID的当前值,而不仅仅是我第一次创建Date.prototype.LCID时的值。

有什么办法可以做到吗?最大的限制是它必须在JavaScript 1.5中工作...尽管我很好奇它是否可以在最新版本中完成。

最佳答案

Number(0) === 0。在原始值上修改.valueOf.toString无效。

正确的方法是使用Number operator传递new构造函数的实例:

var Response = {
    LCID: 321
};
Date.prototype.LCID = new Number();   // <-- Use the "new" operator
Date.prototype.LCID.valueOf = function() { return Response.LCID; };


带注释的演示和注释:http://jsfiddle.net/tx2fW/7/


LCID是一个对象。 typeof new Date().LCID === 'object'
LCIDNumber的真实实例。 new Date().LCID instanceof Number === true
LCID等于321:(new Date().LCID == 321) === true
LCID与321:(new Date().LCID === 321) === false不同。
(因为LCID是对象,而321是原始数字值)。


PS。如果您不熟悉=====,请参见Which equals operator (== vs ===) should be used in JavaScript comparisons?

09-25 16:41