Я пытаюсь создать себе небольшую вспомогательную библиотеку.во-первых, для целей обучения, а затем, чтобы потом я мог расширить его, чтобы он мог пригодиться в проектах.
Я немного понимаю ссылки на прототипы, замыкания и область видимости.Я также намеренно сделал это, используя модульный шаблон, поэтому мой toolbox
не загрязняет глобальное пространство имен.Я также знаю, что мы можем назначать прототипы функциям конструктора, поэтому созданные объекты будут содержать эти методы.
Вот содержимое toolbox.js
(function (window) {
var toolbox = (function () {
var toolbox = function(it){
return new pick(it);
}
var pick = function (it){
var craft = document.getElementsByTagName(it);
craft = Array.prototype.slice.call(craft, 0);
return Array.prototype.push.apply(this, craft);
}
pick.prototype = toolbox.prototype = {
raw: function(){
return Array.prototype.slice.call(this, 0);
},
tell: function(secret){
return secret;
}
}
return toolbox;
}());
window.toolbox = toolbox;
})(window);
и вызов toolbox
:
toolbox("div"); //returns the desired object with the div collection
toolbox("div").raw(); //returns a raw array with the divs
toolbox().tell("A secret"); //returns "A secret"
toolbox.tell("It's a secret"); //type error: the function has no method like tell (like hell it does...should)
, но с изменением приведенного выше кода следующим образом:
var toolbox = (function () {
var toolbox = function(it){
return new pick(it);
}
...
toolbox.tell(secret){ return secret }
return toolbox;
}());
будет работать.
Поэтому мой вопрос заключается в том, почему toolbox.prototype = {}
не справляется, а pick.prototype = {}
заставит pick
наследовать определенные методы?
Я бы хотел добиться обоих toolbox.tell("something");
и toolbox("div").raw();
возможно, без необходимости прямого прототипирования метода в модуль.
Пожалуйста, помогите!Я несколько дней гуглял, чтобы выучить их, и сейчас застрял.Ваша помощь очень ценится!
ОБНОВЛЕНИЕ
Вот как jQuery делает это в двух словах:
(function( window, undefined ) {
var jQuery = (function() {
// Define a local copy of jQuery
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
}
jQuery.fn = jQuery.prototype = {
constructor: jQuery,
init: function( selector, context, rootjQuery ) {
//init stuff
}
};
// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
jQuery.extend = jQuery.fn.extend = function() {
//extend stuff
};
jQuery.extend({
//extend stuff
});
// Expose jQuery to the global object
return jQuery;
})();
window.jQuery = window.$ = jQuery;
})(window);