0

我正在尝试构建一个简单的插件架构,允许使用一个很好的简单 API。考虑以下代码:

//the core library namespace
var testObj = {};

//constuctor
testObj = function() {

};

//The plugin
testObj.prototype.test = (function(){

    var i = 0;

    var init = function() {
        alert('initialized');
    }

    return {
        init: init,

        render: function(){
            return i;
        }
};

}());


var p = new testObj();
//p.test.init();
p.test();

在这里工作小提琴:http: //jsfiddle.net/8LwRL/

我希望用户能够通过执行 p.test() 来调用 init 方法。目前这不起作用,任何使用该插件的人都必须调用 p.test.init()。有什么方法可以将其抽象出来,以便用户可以按名称调用原型方法并让 init 自动运行?

4

2 回答 2

2

正如我在评论中已经提到的,如果你想让它成为p.test可调用的,你必须从 IIFE 返回一个函数,而不是一个(简单的)对象。最直接的方法是返回init自身。您的代码可能看起来像

testObj.prototype.test = (function(){
    var i = 0;
    var init = function() {
        alert('initialized');
    };

    init.render = function(){
        return i;
    };
    return init;
}());

这似乎有点奇怪(对我来说),但它会做你想做的事。

于 2013-11-14T10:01:53.790 回答
1

我的更正版本:

//constuctor
var testObj = function(options) {
this.init(options);
};

//I prefer to use jQuery.extend() to extend prototype. Its look better
$.extend(testObj.prototype,{
    options: {},
    init: function (options) {
       this.options = options;
       console.log('Name on init ' + options.name );
       this.options.name = 'Peter';
    },
    test: function () {
        console.log('name on test: ' + this.options.name);
    }
})


var p = new testObj({name: 'John'});
p.test();

jsfiddle

于 2013-11-14T10:03:37.390 回答