Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在tabs.js中使用新关键字_Javascript_Jquery_Twitter Bootstrap - Fatal编程技术网

Javascript 为什么在tabs.js中使用新关键字

Javascript 为什么在tabs.js中使用新关键字,javascript,jquery,twitter-bootstrap,Javascript,Jquery,Twitter Bootstrap,嘿,伙计们,我刚刚浏览了的代码,我遇到了以下代码行: if (!data) $this.data('bs.tab', (data = new Tab(this))) if (typeof option == 'string') data[option]() 现在我有一个问题,关于上面的两行代码,为什么要使用新的关键字?为什么不能直接调用Tab()函数,如下所示: 选项卡[选项]()而不是数据[选项]() 这种添加新关键字的编码惯例对所有引导插件都是通用的,我只是想知道为什么,我不是问新

嘿,伙计们,我刚刚浏览了的代码,我遇到了以下代码行:

  if (!data) $this.data('bs.tab', (data = new Tab(this)))
  if (typeof option == 'string') data[option]()
现在我有一个问题,关于上面的两行代码,为什么要使用新的关键字?为什么不能直接调用
Tab()
函数,如下所示:

选项卡[选项]()
而不是
数据[选项]()

这种添加新关键字的编码惯例对所有引导插件都是通用的,我只是想知道为什么,我不是问新关键字做什么,我只是问,为什么在这个场景中使用它?我在这里读过这个关于关键字的帖子

但我的问题是:

为什么要使用新的关键字?为什么不能直接调用
Tab()
函数

为什么要使用
new
关键字?为什么不能直接调用
Tab()
函数

如果
Tab
是这样写的,它可能是。显然不是,它是作为标准构造函数编写的,因此您可以将它与
new
一起使用

可以将其作为构建器/工厂函数编写。选择使用构造器还是使用构造器在很大程度上取决于风格(尽管道格拉斯·克罗克福德会告诉你使用构造器/工厂有很好的理由——他对此有很强的观点,但事实就是这样,观点:-))

为了完整起见,构造函数是按照以下方式编写的:

function Tab(arg) {
    this.prop = "something";
    this.thingy = arg; // Or something less direct
    // ...
}
Tab.prototype.method = function() {
    // ...
};
正如您所看到的,它希望通过
new
调用,并将属性放在
this
上,这是对
new
创建的新对象的引用

而建筑商/工厂是这样写的:

function createTab(arg) {
    return {
        prop: "something",
        thingy: arg // Or something less direct
        method: function() {
            // ...
        }
        // ...
    };
}
var tabPrototype = {
    method: function() {
        // ...
    }
};
function createTab(arg) {
    var obj = Object.create(tabPrototype);
    obj.prop = "something";
    obj.thingy = arg; // Or something less direct
    return obj;
}
或者像这样:

function createTab(arg) {
    return {
        prop: "something",
        thingy: arg // Or something less direct
        method: function() {
            // ...
        }
        // ...
    };
}
var tabPrototype = {
    method: function() {
        // ...
    }
};
function createTab(arg) {
    var obj = Object.create(tabPrototype);
    obj.prop = "something";
    obj.thingy = arg; // Or something less direct
    return obj;
}

@TJCrowder,我会看你的答案,但我只想说,你是我的榜样:D@TJCrowder非常感谢,解释得很好,是的,我知道道格拉斯·克罗克福德不喜欢这个新关键词。最后,你能编辑你的答案吗?如果按工厂,你指的是工厂设计模式??非常感谢@Tenali_raman:不,只是一个无聊的老工厂函数:一个创建实例的函数。工厂模式比这更重要;工厂函数被定义为子类实现的接口,这样基类工厂就可以创建实例,而不必知道它正在创建什么特定的子类类型。这是一个简单工厂函数的超集。@TJCrowder,谢谢你,谢谢你的解释。非常感谢。