2012-06-28 56 views
0

我正在開發一個jQuery插件使用揭密原型模式,我有一些麻煩來實例化我的對象。下面,插件的代碼:實例時jQuery插件使用揭示原型模式

(function($) { 

var GammadiaCalendar = function(elem, options) { 
    this.elem = elem; 
    this.$elem = $(elem); 
    this.options = options; 
}; 

GammadiaCalendar.prototype = function() { 

    var defaults = { 
     message: 'Hello world!' 
    }, 

    init = function() { 

     this.config = $.extend({}, this.defaults, this.options); 

     this.displayMessage(); 

     return this; 
    }, 

    displayMessage = function() { 
     alert(this.config.message); 
    }; 

    return { 
     displayMessage : displayMessage 
    }; 


}; 

GammadiaCalendar.defaults = GammadiaCalendar.prototype.defaults; 

$.fn.GammadiaCalendar = function(options) { 
    return this.each(function() { 
     new GammadiaCalendar(this, options).init(); 
    }); 
}; 

})(jQuery) 

我越來越GammadiaCalendar沒有定義

VAR GC =新GammadiaCalendar( '身份證');

+0

這個你不能做的含功能var gc = new GammadiaCalendar('id');外模式非常多餘,因爲你已經在一個IIFE中了,原型和它的構造函數只能在這裏使用。 – Esailija

回答

1

的問題是,你已經設置了原型爲函數表達式,而不是作爲一個立即調用的函數表達式。你需要改變它:

GammadiaCalendar.prototype = (function() { 
    // your code here 
})(); // Execute it 

此外,該行永遠不會成功:

GammadiaCalendar.defaults = GammadiaCalendar.prototype.defaults; 

因爲defaults永遠不會回到原形。

顯示原型模式的整個結構不正確。由new GammadiaCalendar(this, options).init()使用的init函數是私有的,因此不可訪問。因此,原型需要改變的東西是這樣的:

GammadiaCalendar.prototype = (function() { 
    var defaults = { 
    message: 'Hello world!' 
    }, 
    init = function() { 
    this.config = $.extend({}, this.defaults, this.options); 
    this.displayMessage(); 
    return this; 
    }, 
    displayMessage = function() { 
    alert(this.config.message); 
    }; 

    return { 
    defaults: defaults, 
    init: init, 
    displayMessage : displayMessage 
    }; 

})(); 

(當然,通過做這種方式,你還沒有真正獲得這種模式東西,因爲裏面有沒有真正的私人功能了)。

0

我沒有看到這種模式的任何一點,你可能只是這樣做:

(function($) { //Because of this, everything here is "private" unless exposed anyway 

    var defaults = { 
      message: 'Hello world!' 
    }; 

    function init() { 
     this.config = $.extend({}, defaults, this.options); 

     this.displayMessage(); 

     return this; 
    } 

    var GammadiaCalendar = function(elem, options) { 
     this.elem = elem; 
     this.$elem = $(elem); 
     this.options = options; 
    }; 

    GammadiaCalendar.prototype = { 

     displayMessage: function() { 
      alert(this.config.message); 
     }, 

     constructor: GammadiaCalendar 
    }; 


    GammadiaCalendar.defaults = defaults; 

    $.fn.GammadiaCalendar = function(options) { 
     return this.each(function() { 
      var instance = new GammadiaCalendar(this, options); 
      init.call(instance); 
     }); 
    }; 

})(jQuery); 

需要注意的是,因爲它沒有暴露