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