二传手/吸盘器不适用于数字文字
setter/getter not working for Number literal
我认为将我对 Number.prototype 的零填充扩展重写为真正的 getter/setter 模式会很有趣。不是很困难。我最终得到了这段代码(addSetter
和addGetter
只是使用 prototype.__defineGetter__ / __defineSetter__
的包装器函数。
Number.addSetter('leftPad0',
function(v){
var len = (String(v).length - String(this).length)+1;
this._leftPad0 = new Array(len).join('0')+this;
}
);
Number.addGetter('leftPad0',
function(){
return this._leftPad0;
}
);
适用于实数对象:
var a = new Number(977);
a.leftPad0 = 10000;
alert('a => '+a.leftPad0); // a => 00977
但不适用于数字文字:
var b = 977;
b.leftPad0 = 10000;
alert('b => '+b.leftPad0); // b => undefined
那么,b不是到达二传手吗?或者如果它到达二传手,它不是一个数字吗?
我从setter函数中将其记录在控制台中:
this.constructor === Number // true
this instanceof Number //true
还是没有达到 getter,或者当它到达时,文字不是 Number 的实例吗?我在吸气机中记录了相同的内容。一切都很好,也很真实。
那么,我们无法使用数字文字使用此模式的原因可能是什么?还是我错过了什么?
注意:如果我使用此原型扩展("猴子补丁"),则不会发生这种情况:
Number.prototype.leftPad = function(base){
var len = (String(base).length - String(this).length)+1;
return new Array(len).join('0')+this;
}
alert( (977).leftPad(10000) ); // 00977
[编辑] 我仍然想知道我们是否必须称其为错误,或者它是否遵循/标准。无论如何,我现在为此设置了自己的对象:
function NumPL(val,pval,chr){
if (!(this instanceof NumPL)){
return new NumPL(val,pval,chr);
}
this._value = new Number(val||0);
this._padValue = pval || 10;
this.chr = chr || '0';
}
NumPL.prototype = {
get value(){
return this._value;
},
set padValue(v) {
this._padValue = v%10 === 0 ? v : 10;
},
set value(v) {
this._value = v;
},
get padLeft(){
var len = (String(this._padValue).length -
String(this._value).length)+1;
return new Array(len).join(this.chr)+this._value;
}
}
// Usage
var a = NumPL(977,10000);
alert(a.padLeft); //=> 00977
// or a real world example
var dat = new Date,
datshort = [dat.getFullYear(),
NumPL(dat.getMonth()+1).padLeft,
NumPL(dat.getDate()).padLeft]
.join('/');
alert(datshort); //=> 2011/05/19
文字数字不是Number
:
typeof 3
// "number"
typeof new Number(3)
// "object"
因此,没有原型可以修改数字文字。
但是,当您尝试在数字文本上设置属性时,看起来文本首先包装在 Number 对象中。然后,在该对象上调用 setter,this
将是 setter 函数中的一个对象。然后,当资源库返回时,文本被解包,并且此解包将属性(在对象包装器上设置)抛在后面。
Number.prototype.__defineSetter__('leftPad0',
function(v) {
alert('In setter: ' + v + ' ' + (this instanceof Number));
var len = (String(v).length - String(this).length) + 1;
this._leftPad0 = new Array(len).join('0') + this;
}
);
var a = new Number(977);
a.leftPad0 = 10000;
alert('a => ' + a._leftPad0);
var b = 977;
b.leftPad0 = 10000;
alert('b => ' + b._leftPad0);
http://jsfiddle.net/ambiguous/H77qk/2/
我在几个浏览器中收到了上述四个警报。
抱歉,我没有这种行为的权威参考,只有经验证据。
var b = 9;
表示b
是对基元类型的引用,而不是类型Number
的对象。
var b = new Number(9)
创建一个类型 Number
的对象,该对象将包含添加到Number
原型的函数,而不是基元数字类型。
- AddEventListener适用于浏览器,但不适用于Android
- 查找仅适用于原始图像的图像放大算法的名称
- 如何在category.php中执行jquery,这应该适用于类别wordpress中的每个帖子
- Web编程,简单但适用于机器人项目
- JavaScript不适用于internet explorer和Firefox,但适用于谷歌
- Jquery事件处理程序仅适用于匿名函数
- jQuery调整大小函数只适用于窗口
- 火灾在卸载前确认警报仅适用于外部站点
- EmberJS-适用于各种模型的适配器动态名称空间
- Facebook共享链接适用于用户,但不适用于粉丝页面管理员
- jQuery-适用于移动设备的多级菜单
- 循环中的切换脚本只适用于第一次迭代
- 为什么setTimeout适用于无休止的递归调用
- 我未保存的更改指令需要适用于具有不同名称的所有表单
- 货币过滤器是否仅适用于使用 $scope.$eval() 的数字
- toExponential()仅适用于具有有效小数的大数字
- javascript中的Y-Combinator factorial适用于数字,而不适用于Church数字
- toString只适用于括号或非文字数字
- 从URL加载变量,仅适用于数字
- Wrapall 适用于数字,但不适用于变量