私は小さなヘルパー ライブラリを自分で構築しようとしています。最初は学習目的で、後でプロジェクトで役立つように拡張できます。
プロトタイプの参照、クロージャー、スコープについてある程度理解しています。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);