JS中有这样的模式吗?

时间:2012-05-11 07:16:29

标签: javascript prototype

是否有简洁的方法来实现以下设计模式?

function a() {
    function x() { /* code */ }
    function y() { /* code */ }
    /* more code */
    x(); y(); // these can be called here
}

a();
a.x();
a.y();

我最近熟悉原型,可能会使用这样的东西:

a = function() { }
a.prototype.x = function() { }
a.prototype.y = function() { }

但也许有一种更苗条的方式?因为我的代码a也属于其他原型,即

function plugin() { ... }
plugin.prototype.a = function () {}
plugin.prototype.a.prototype.x = function () {}
plugin.prototype.a.prototype.y = function () {}

4 个答案:

答案 0 :(得分:1)

为什么不使用这样的简单定义功能* a *

function a( x , y){
   x();
   y();
}

并按照以下方式调用:

x = function(){
 // some code
}

y = function(){
 // some code
}

a(x,y);

OR就此而言

a(
function(){
  // some code
},
function(){
 // some code
}

);

即使'a'属于别人的原型

你可以这样做: -

  someOtherObj.prototype.a = function( x , y){
       x();
       y();
     }

并且在定义或匿名之后调用时只传递x和y。

答案 1 :(得分:1)

你可以这样写:

function a() {
    this.x = function () { /* code */ }
    this.y = function () { /* code */ }
    /* more code */
    this.x(); this.y(); // these can be called here
}

var test = new a();
test.x();
test.y();

答案 2 :(得分:1)

您可以使用singleton or module pattern保持代码状态并避免冲突:

var foo = function(){
  // private members
  var bar;
  baz: function(){return bar;}

  // public members go here
  return {
    getBaz: baz
  }
}();

只有您通过上述return提供的成员才能在外部范围内使用,其余成员仅限于该对象。

有关更多设计模式的想法,请参阅:

答案 3 :(得分:1)

如果您正在寻找支持动态对象组合的JavaScript语言机制,就像您在问题中描述的那样,Object有三个相关的功能可能会有所帮助(请注意,所有三个都需要 JavaScript 1.8.5):

如果您正在寻找更多实际设计模式,有许多涉及您问题的各个方面,但我相信最符合构建模块方法的设计模式似乎是这些文章(由不同的作者)描述了关于在JavaScript中实现设计模式的问题的主要主题:

希望这有用 -