2015-05-04 5 views
2

Эй, ребята, я просто проходящие через код tabs.js и я наткнулся на следующие строки кода:Почему использование нового ключевого слова внутри tabs.js

if (!data) $this.data('bs.tab', (data = new Tab(this))) 
    if (typeof option == 'string') data[option]() 

теперь у меня есть вопрос выше найденной 2 строки кода. Почему используется новое ключевое слово? почему не может быть вызвана функция Tab(), например:

Tab[option]() вместо data[option]()?

это соглашение о кодировании добавления нового ключевого слова является общим для всех плагинов начальной загрузки, я просто хочу знать, почему, я не спрашиваю, что делают новые ключевые слова, я просто спрашиваю, почему он используется в этом сценарии? Я прочитал эту тему здесь, в ключе new.

но мой вопрос на самом деле:

Почему новое ключевое слово используется? почему бы не вызвать функцию Tab()?

ответ

2

Почему используется ключевое слово 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; 
} 
+0

@TJCrowder, я пойду через ур ответ, но только хотел сказать, Ур моя модель ролей: D –

+0

@Tenali_raman: О, дорогой. Ну удачи! ;-) –

+0

@TJCrowder Спасибо, Soooo много, очень хорошо объяснил и да, я знаю, что Дуглас Крокфорд не любит новое ключевое слово. наконец, можно отредактировать свой ответ, если упомянуть, если по заводу, вы имеете в виду шаблон заводского дизайна? Большое спасибо ! –

Смежные вопросы