如果我有
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
。
我做错了什么?
答案 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
当然,这整个概念都是一个坏主意,通常不应该将新方法附加到原生原型上