2009-12-28 69 views
2

我一直在尝试javascript中的一些基础知识,这里是我观察到的。在Javascript中使用函数分配进行原型设计

我写函数对象的原型修改方法

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

尝试执行'crappyFunction'方法时出现错误 – 2009-12-28 21:04:09

回答

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,理想情况下,它不应使用自定义方法进行扩展)。

+0

它不起作用,如上所述。它真的在“my_skill”上引发错误。 – artificialidiot 2009-12-28 19:08:10

+0

这一点是正确的。因此,我认为我的someCrappyVariable也无法继承原型方法的问题在于,它是从对象继承而不是从函数继承。 为什么它会继承对象?我们没有给它分配一个函数吗? – Priyank 2009-12-28 19:11:21

+0

new通过新创建的对象调用作为构造函数方法的函数。你的代码中还有一个错误,我将作为答案发布。 – artificialidiot 2009-12-28 19:44:03

-1

如果我们删除“new_pirate”的代码,仍然有错误。

在标准js中,可以通过在运行之前分配构造函数的原型属性来创建对象的原型链,并创建该对象。所以如果你在someCrappyVariable上调用“方法”,它只会在创建对象的“prototype”属性上设置“名称”,这几乎是无用的。

你所需要做的就是设置someCrappyVariable.constructor.prototype [name],这样所有具有相同构造函数的对象都可以像someCrappyVariable [name](在这种情况下由匿名函数创建)那样找到set方法。