2011-03-18 73 views
1

对不起,如果以前有人问过这个问题,但我什至不知道什么搜索条件用来找到答案,当我尝试搜索时,我从来没有得到任何具体的问题。函数和封装形式?

我使用Javascript和我想知道是否有可能做这样的事情:

find(x);    // find a document (for example) 
find.inFolder(y); // find a folder's documents (for example) 

换句话说,我可以有也可以用来作为一个对象/类的功能?我知道我可以运行find()一次并返回一个散列,这样find.inFolder()就可以工作,但是我希望有一种方法可以让我继续调用 find()。

它可以通过原型来完成吗? (我的“原型”知识非常有限)

function find() {} 
find.prototype.inFolder = function() {} 

它可以在散列内完成吗? [我知道这个代码不起作用]

var find = { 
    () : function() {}, 
    inFolder : function() {} 
} 

为了进一步推动它,是有办法有.inFolder的结果()被发送到查找()函数是这样的:

find().inFolder(); 

我知道你可能会说我不明白JavaScript的概念,并且你基本上是正确的,但我已经看到人们用JS做了一些非常了不起的事情,所以我想我会问专业人员在那里。

在此先感谢您的帮助。

回答

2

你所描述的是一个Fluent interface(如果你想要搜索的东西)。你可以做到像你想达到这样的内容:

var find = function() { 
    this.inFolder = function() { 
     return this; // Although to stop chaining, you could return nothing here. 
    }; 
    return this; 
}; 

find().inFolder(); // .inFolder().inFolder()... 

这是一个伟大的模式,尤其是在项目的杠杆如jQuery:

$("#element").find(".child_element").first(); 

每次调用都返回一个jQuery对象与.find(),.first()和许多其他功能,它可以让你编写直观和流畅的代码。


我有些喜欢你的find().inFolder()例子,所以这里是一个扩大版:

var find = function(file) { 
    this.folders = { 
     "Documents": ["Foo.txt", "Bar.txt"], 
     "Downloads": ["File.exe"], 
     "Misc": ["Picture.jpg"] 
    }; 

    this.file = file; 

    this.inFolder = function(folder) { 
     var files = this.folders[folder]; 
     return files.indexOf(this.file) >= 0; 
    }; 
    return this; 
}; 

alert(find("Foo.txt").inFolder("Documents")); // True 
alert(find("File.exe").inFolder("Downloads")); // True 
alert(find("Picture.jpg").inFolder("Downloads")); // False 

http://jsfiddle.net/andrewwhitaker/TCdTd/

+0

纯真棒!谢谢谢谢! – 2011-03-18 14:27:36

2

您可以分配,一个功能到另一个功能中的一员:

find = function(x) { .... } 
find.inFolder = function(y) { ... } 

jsFiddle

但我不确定我是否理解这个问题。

+0

这完美的作品。谢谢! – 2011-03-18 14:29:31