我一直在用javascript尝试一些基础知识,这就是我观察到的。
我为Function对象
编写了一个原型修改方法Function.prototype.method = function(name, func)
{
this.prototype[name] = func;
return this;
}
function pirates(value)
{
console.log("I just throw away the value!!" + value);
}
pirates.method("my_skill", function(){
console.log("Pirate skills");
});
new_pirate = new pirates(1234);
//SUCCESS
new_pirate.my_skill(); //prints "Pirate skills"
var someCrappyVariable = function(){
return function()
{
console.log("I am going to just sit and do nothing. Really!");
}
}();
**//Throws error. WHY???????? This was assigned a function, so ideally prototype should work on this too? Shouldn't it?**
someCrappyVariable.method("crappyFunction", function(){
console.log("am I doomed?");
});
为什么最后的赋值会抛出someCrappyVariable不是函数的错误,当它之前被分配了函数引用时?我很困惑。
干杯
答案 0 :(得分:2)
您的代码应该在这里抛出错误:
new_pirate.method("my_skill", function(){
console.log("Pirate skills");
});
// TypeError: new_pirate.method is not a function
...因为method
不是直接或继承的方法。从new pirates(1234)
创建的对象不会从Function
继承;它将继承自Object
(,理想情况下,不应使用自定义方法扩展)。
答案 1 :(得分:-1)
如果我们删除“new_pirate”的代码,则仍然存在错误。
在标准js中,可以通过在运行之前指定构造函数的prototype属性来建立对象的原型链,并创建对象。因此,如果你在someCrappyVariable上调用“方法”,它将仅在创建的对象的“prototype”属性上设置“name”,这几乎没用。
你真正想要的是设置someCrappyVariable.constructor.prototype [name],这样所有具有相同构造函数的对象都可以找到像someCrappyVariable [name]这样的set方法(在这种情况下由匿名函数创建)。