使用Javascript中的函数赋值进行原型设计

时间:2009-12-28 18:51:38

标签: javascript

我一直在用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不是函数的错误,当它之前被分配了函数引用时?我很困惑。

干杯

2 个答案:

答案 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方法(在这种情况下由匿名函数创建)。