javascript - 在 javascript 中的 Object.prototype 上添加自定义方法的副作用

标签 javascript prototype prototypal-inheritance

我正在向 Master Object.prototype 添加一个自定义 add() 方法,以便所有通用对象都能够访问此 add( ) 方法

Object.prototype.add = function(value1, value2) {
return value1 + value2;
};

问题 1:如何检查此 add() 方法是否可枚举?

我正在创建一个通用对象

var obj = {

}

我正在使用 for-in 循环来打印所有属性(这应该打印自己的属性和原型(prototype)属性)

for (prop in obj){

    console.log("property is :" + prop);
}

这个打印的//属性是:add

问题 2:for-in 循环是否打印可枚举和不可枚举属性?

让我们使用Object.keys,它返回一个属性数组(仅当可枚举时)

var propKeys = Object.keys(obj);
console.log(propKeys); //prints an empty array []

问题 3:为什么 Object.keys 不打印 add 属性?

最佳答案

为了回答问题 2,当且仅当属性是可枚举的时,for-in 循环才会迭代该属性,因此没有不可枚举的属性。

要回答问题 1,为了检查属性是否可枚举,您实际上可以使用 for-in 循环,例如:

function isEnumerable(object, property) {
    for (prop in object) {  
        if (prop === property) {
            return true;
        }
    }
    return false;
}

您的 for-in 循环打印“add”这一事实意味着它是可枚举的。事实上,您在自己的代码中定义的所有属性默认都是可枚举的。

为了回答问题 3,Object.keys() 仅当属性既是可枚举的又是自己的属性时才会为您提供属性。由于 .add 是继承的,因此使用 Object.keys() 不会显示它。

希望这有帮助!

关于javascript - 在 javascript 中的 Object.prototype 上添加自定义方法的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36638004/

相关文章:

javascript - 用户名不能是电子邮件格式,因为用户池是为电子邮件配置的

javascript - 当我使用 Javascript 重新加载表单时,我无法保留之前保存的弹出表单数据 - jointJS

javascript - 找不到在 componentWillMount 中设置的属性

javascript - 构造函数调用绑定(bind)函数的代理

Javascript:数组成员变量在原型(prototype)继承中不作为实例变量工作

javascript - 我怎样才能有效地原型(prototype)数组或从数组重用代码?

javascript - 使用新数据更新 d3 图表

JavaScript 原型(prototype)覆盖

javascript - 在javascript中制作特殊的函数原型(prototype)

javascript - 如何将原型(prototype)分配给已经构建的对象?