学习阮一峰老师ES6教程,链接为:数值的扩展
里面讲解Number.isInteger如何在ES5上部署,有这样一段代码:
(function (global) {
var floor = Math.floor,
isFinite = global.isFinite;
Reflect.defineProperty(Number, 'isInteger', {
value: function(value) {
console.log(value);
//这里输出25,问题来了,Number.isInteger(25)为什么会进入value描述符定义的函数呢?没见过这么玩的
return typeof value === 'number' &&
isFinite(value) &&
floor(value) === value;
},
configurable: true,
enumerable: false,
writable: true
});
})(this);
// true
console.log(Number.isInteger(25) );
我一直搞不明白为什么对Number定义isInteger属性,Number.isInteger(25)这样调用会进入value描述符对应的函数里面呢?
搞不懂上面的问题,我就自己写一段代码进行测试:
let obj={
}
Reflect.defineProperty(obj, 'showName',{
value:value=>{
console.log('value',value);//也进入了
return value;
},
configurable:true,
enumerable:false,
writable:true
});
obj.showName('nihao');
运行结果为:
和期望中的运行结果一样,
我特意去查了一下Object.defineProperty的用法,链接为:Object.defineProperty用法
里面对value描述符用法的解释是这样的:
value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。
并没有说明value描述符对应的是作为函数调用呀?!!
关键问题
拼写错误,你把 defineProperty 写成了 deleteProperty
另外
这里的属性描述符,描述的属性是一个函数,说白了就是定义方法。
你给
value
的是一个函数表达式,所以它就是一个函数形式,当然就可以当作函数来用。如果给的是其它值,就是当其它值来用,而且如果配置了
writable: true
,还可以修改