Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中的Object.prototype上添加自定义方法的副作用_Javascript_Prototype_Prototypal Inheritance - Fatal编程技术网

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

在javascript中的Object.prototype上添加自定义方法的副作用,javascript,prototype,prototypal-inheritance,Javascript,Prototype,Prototypal Inheritance,我正在向主对象添加一个自定义add()方法。prototype,以便所有通用对象都能够访问此add()方法 Object.prototype.add = function(value1, value2) { return value1 + value2; }; 问题1:如何检查此add()方法是否可枚举 我正在创建一个通用对象 var obj = { } 我正在使用for in循环打印所有属性(这应该打印自己的属性和原型属性) 此打印的//属性为:add 问题2:for in循环的是否同时

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

Object.prototype.add = function(value1, value2) {
return value1 + value2;
};
问题1:如何检查此
add()
方法是否可枚举

我正在创建一个通用对象

var obj = {

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

此打印的
//属性为:add

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

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


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

要回答问题2,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
,因此它不会使用
对象.keys()
显示

希望这有帮助

var propKeys = Object.keys(obj);
console.log(propKeys); //prints an empty array []
function isEnumerable(object, property) {
    for (prop in object) {  
        if (prop === property) {
            return true;
        }
    }
    return false;
}