javascript - 在 JavaScript 中扩展 Math 对象

标签 javascript extend

由于直接扩展内置对象是不好的做法,我正在考虑创建一个扩展全局对象的本地对象,例如使用 $.extend(obj, Math)Math 是一个对象,但是您似乎无法像这样访问它的任何属性:

for (obj in Math) {
   console.log(obj);
}

为什么?

最佳答案

因为它们都被定义为不可枚举。规范定义对象的几乎所有内置属性都是不可枚举的。当您枚举对象中的属性时(通过 for-inObject.keys),不可枚举的属性不会显示。

不过,有两个想法:

  1. 您可以使用 Math 作为其原型(prototype)来创建您的对象,如下所示:

     // Create the MyMath object with Math as its prototype
     var MyMath = Object.create(Math);
    
     // Check that MyMath has a Math function on it
     display(MyMath.floor(2.3));
    
     // Utility function
     function display(msg) {
         document.body.insertAdjacentHTML("beforeend", "<p>" + msg + "</p>");
     }
     

  2. ES5 引入了一个新函数,Object.getOwnPropertyNames ,它可以从对象中获取所有属性(可枚举和不可枚举)的名称。 (由于 Math 的原型(prototype)是 Object.prototype,您可能只需要“自己的”属性。)所以您可以在符合 ES5 的引擎上执行此操作:

    // Create the MyMath object with all of the own properties on Math
    var MyMath = {};
    Object.getOwnPropertyNames(Math).forEach(function(name) {
        MyMath[name] = Math[name];
    });
    
    // Check that MyMath has a Math function on it
    display(MyMath.floor(2.3));
    
    // Utility function
    function display(msg) {
        document.body.insertAdjacentHTML("beforeend", "<p>" + msg + "</p>");
    }

选项 1 可能是您更好的选择,尤其是因为 Object.create 的单参数版本可以在 ES5 之前的引擎上填充/填充。

关于javascript - 在 JavaScript 中扩展 Math 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296097/

相关文章:

JavaScript 克隆一个 "class"实例

c# - 扩展 Label 控件 - 添加 Click 事件处理程序

javascript - 从数据库中检索数据而不刷新页面

javascript - 提交带有 React 输入字段的标准 HTML 表单

javascript - 使用 easyXDM 在父文档和从不同域加载的子 iframe 之间进行通信(亚马逊)

javascript - i++ 在三元语句中不起作用

javascript - jquery .html 之后无法寻址 Html 元素

symfony1 - 为 sfDoctrineGuard 插件的 sfGuardUser 模型添加 avatar 字段

UML 用例图 - 扩展点识别

javascript - jQuery 扩展,无法读取未定义的属性