JavaScript:向函数原型添加方法

14

有没有更短的方式来书写这个呢:

var controller = function(){ 
    /*--- constructor ---*/
}; 

controller.prototype.function1 = function(){ 
    //Prototype method1
}

controller.prototype.function2 = function(){ 
    //Prototype method2
}

controller.prototype.function3 = function(){ 
    //Prototype method3
} 

return controller
我正在使用require.js。我想知道是否可以避免控制器原型代码的重复。

我正在使用require.js。我想知道是否可以避免控制器原型代码的重复。


你可能可以通过一个对象来扩展原型,但是为什么要这样做呢?每次添加原型时,使用“prototype”进行输入既能保证可读性,也能避免出错。 - adeneo
这正是我想知道的 :-) 不断重复的代码总让我感到可疑。 - html_programmer
1
你可以很简单地使用ref快捷方式:var cp=controller.prototype; 然后cp.function3= ... 你也可以使用对象字面量来实现更高级的操作,或者如果你只需要支持暴露函数名称的环境,你可以变得非常“优雅”。 - dandavis
那似乎确实是一个明显的向前迈进的步骤。谢谢。 - html_programmer
1
虽然给出的答案都很好,但是可以抛弃使用jQuery的extend方法,因为这与下面给出的protomix函数非常相似。 - Jeremy J Starcher
3个回答

14

使用帮助函数

虽然这个方法比起给出的答案更长,但如果你需要在多个地方执行此操作,定义一个帮助方法可能会很有用:

function protomix(constructor, mix){
    for(var i in mix)
      if(mix.hasOwnProperty(i))
          constructor.prototype[i]=mix[i];
}

var controller = function(){
 //constructor
};

protomix(controller, {

   function1 :  function(){ 
       //Prototype method1
   },

   function2:  function(){ 
       //Prototype method2
   },

   function3 : function(){ 
    //Prototype method3
   } 
});

return controller;

使用jQuery的extend方法

我认为应该提到jQuery的extend方法,因为它在评论中被提及,并且通常比第一部分答案中定义的小助手方法具有更多的功能:

var controller = function(){ /* ctor */};
return $.extend(controller.prototype,{

   function1 :  function(){ 
       //Prototype method1
   },

   function2:  function(){ 
       //Prototype method2
   },

   function3 : function(){ 
    //Prototype method3
   } 
});

其他库

其他库也内置了类似的功能,比如Underscore的extend方法Lo-Dash的assign方法


我接受了,因为你是对的。我计划在我的应用程序中使用很多控制器,所以这个函数会非常有用。谢谢。 - html_programmer

1
使用ES6,你还可以使用对象解构。
function Foo() {
}

Foo.prototype = {
  ...Foo.prototype,
  foo() {},
  bar() {},
  baz() {}
}

0

Object.assign(controller.prototype, { function1: ... })


1
最好使用Object.defineProperties。 - user734320

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接