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

时间:2016-04-15 03:58:06

标签: javascript prototype prototypal-inheritance

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

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

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

我正在创建一个通用对象

var obj = {

}

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

for (prop in obj){

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

这打印//property is :add

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

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

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

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

1 个答案:

答案 0 :(得分:1)

要回答问题2,for-in循环将遍历属性,当且仅当它是可枚举的,因此没有非可枚举的属性。

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

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

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

要回答问题3,Object.keys()仅在属性和可用属性时才会为您提供属性。由于.add是继承的,因此不会使用Object.keys()显示。

希望这有帮助!