ES6中Reflect.defineProperty怎么使用?

学习阮一峰老师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描述符对应的函数里面呢?

clipboard.png

搞不懂上面的问题,我就自己写一段代码进行测试:

let obj={
}
Reflect.defineProperty(obj, 'showName',{
    value:value=>{
        console.log('value',value);//也进入了
        return value;
    },
    configurable:true,
    enumerable:false,
    writable:true
});
obj.showName('nihao');

运行结果为:

clipboard.png

和期望中的运行结果一样,
我特意去查了一下Object.defineProperty的用法,链接为:Object.defineProperty用法
里面对value描述符用法的解释是这样的:

value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。

并没有说明value描述符对应的是作为函数调用呀?!!

阅读 4.1k
2 个回答

关键问题

拼写错误,你把 defineProperty 写成了 deleteProperty

另外

这里的属性描述符,描述的属性是一个函数,说白了就是定义方法。


你给 value 的是一个函数表达式,所以它就是一个函数形式,当然就可以当作函数来用。

如果给的是其它值,就是当其它值来用,而且如果配置了 writable: true,还可以修改

Reflect.defineProperty(obj, "name", {
    value: "the name",
    configurable: true,
    enumerable: false,
    writable: true
});

console.log(obj.name);
obj.name = "hello";
console.log(obj.name);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题