【问题标题】:A function and a form of encapsulation?一个函数和一种封装形式?
【发布时间】:2011-07-17 20:51:18
【问题描述】:

很抱歉,如果以前有人问过这个问题,但我什至不确定使用什么搜索词来找到答案,当我尝试搜索时,我从来没有得到任何关于这个问题的具体信息。

我正在使用 Javascript,我想知道是否可以这样做:

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

换句话说,我可以拥有一个也可以用作对象/类的函数吗?我知道我可以运行一次 find() 并返回一个哈希值,以便 find.inFolder() 可以工作,但我希望有一种方法可以让我继续调用 find()。 p>

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

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

可以在哈希内完成吗? [我知道这段代码不起作用]

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

为了更进一步,有没有办法将 .inFolder() 的结果以这种方式发送到 find() 函数:

find().inFolder();

我知道你可能会说我不理解 javascript 的概念,而且你基本上是正确的,但是我看到人们用 JS 做了一些非常了不起的事情,所以我想我会问专业人士在那里。

提前感谢您的帮助。

【问题讨论】:

    标签: javascript function object hash encapsulation


    【解决方案1】:

    您所描述的是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();
    

    每次调用都会返回一个带有.find().first() 和许多其他函数的jQuery 对象,让您编写直观流畅的代码。


    我有点喜欢你的 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/

    【讨论】:

      【解决方案2】:

      您可以将一个函数分配给另一个函数的成员:

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

      jsFiddle.

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-19
        • 2010-10-06
        • 2011-02-11
        • 2021-12-20
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多