我是JavaScript的新手,我正在学习 JavaScript:The Good Parts 这本书。在该书中,以下配方用于增加所有功能的方法:
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
}
我想探索这个概念,所以我提出了以下脚本,旨在将greet()
方法添加到func()
函数中:
//define how the augmentation will work
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
}
//create a dummy function to augment
function func() {
//do nothing
}
//create function to be added
func.method('greet', function() {
console.log("Greetings from greet()!");
});
//access the new function
func.greet();
但是,当我运行它时,我收到错误Uncaught TypeError: undefined is not a function
。有人可以告诉我我做错了什么。
答案 0 :(得分:6)
在这种情况下,您要修改该行:
this.prototype[name] = func;
到
this[name] = func;
或者你可以使用
this.constructor.prototype[name] = func;
但是这会将每个新方法添加到每个函数中,而不仅仅是您调用method
的函数。或者您可以使用:
var f2 = new func();
f2.greet();
<强>为什么吗
在JavaScript中查找对象的属性时,会搜索对象本身,然后搜索对象prototype
的{{1}}(依此类推)。 constructor
的{{1}}为.constructor
。
在这种情况下,如果你写了:
,你所做的就会奏效func
函数的原型用于由该函数创建的新实例。 (您创建的对象本身具有Function
创建函数。)