如何将附加到Object的函数移动到Object.prototype?

时间:2015-12-30 03:26:51

标签: javascript

如果我有

var a={b:2,c:3}

然后

Object.keys(a);//returns ['b','c']

但是我想把它添加到原型中。我能做到:

Object.prototype.keys=function(){return Object.keys(this);}
a.keys();//returns ['b','c']

现在我想将所有附加到Object的函数添加到原型中。这就是我想出的:

Object.getOwnPropertyNames(Object)
    .filter(function(e){return Object[e] && Object[e].constructor.name==="Function"})
    .forEach(function(funcName){ 
        Object.prototype[funcName]=function(){
            return Object[funcName]
               .apply(this,Array.prototype.slice.call(arguments,1));
        }
    });

所以我得到了附加到Object的所有函数。然后我循环遍历它们并将它们附加到原型上。

但是如果我拨打a.keys(),我会收到错误TypeError: Object.keys called on non-object

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您通过Object.keys致电apply(),所以您真的在做

Object.prototype.keys = function(){

    {b:2,c:3}.keys(Array.prototype.slice.call(arguments,1))
    // ^^ or whatever "this" is when you call .apply(this, arguments)
}

这不是你想要的,你只想在这里以常规方式致电Object.keys,你不想设置this值,它应该是{{ 1}},而不是传入的对象,因此将其更改为

Object

当然,这整个概念都是一个坏主意,通常不应该将新方法附加到原生原型上