2013-02-02 54 views
8

使用jQuery编写插件相对容易,只需使用$ .fn即可。像这样:如何在没有jQuery的情况下编写javascript插件

$.fn.analyse = function() { 
... 
} 

但是如果你不能使用jQuery呢?

比方说,我希望能够用下面的代码:

document.querySelector("#mydiv").analyse(); 

我能去这样的:

Object.prototype.analyse = function() { 
... 
} 

但是从我的理解这是令人难以接受的!

+1

然后您只需编写一个接受DOM元素的函数。 –

+0

你的问题到底是什么?你可以创建一个替代jQuery的对象类型并对其进行修改 - 你只需要一点管道就可以做选择。 – Hogan

+0

@Hogan对不起,迟到的答案。现在的问题是:如果Object.prototype.extension被忽略,那么扩展对象功能的首选方法是什么? –

回答

26

这里的东西,让你开始:

var proto_methods = { 
    analyse: function() { 
     var node = this.node; 

     // ... 
    } 
}, wrap, _wrap; 

_wrap = function(selector) { this.node = document.querySelector(selector); }; 
_wrap.prototype = proto_methods; 

wrap = function(selector) { 
    return new _wrap(selector); 
}; 

使用方法如下:

wrap("#mydiv").analyse(); 

使用这个,如果你想添加更多的插件(和它的多一点的面向对象):

var pack = { 
    binder: [{}] 
}; 

pack.query_bind = function(bound) { 
    if (bound) pack.binder[1] = bound; 
}; 

pack.fn = function(attributes) { 
    for (var i in attributes) pack.binder[0][i] = attributes[i]; 
}; 

var _wrap = function(selector) { 
    this.node = /^(#|.)\w+/.test(selector) ? pack.binder[1](selector) : {}; 
}; 

_wrap.prototype = pack.binder[0]; 

var wrap = function(selector) { 
    pack.query_bind(document.querySelector.bind(document)); 
    return new _wrap(selector); 
}; 

wrap.fn = pack.fn; 

wrap.fn({ 
    cool: function() {}, 
    nice: function() {} 
}); 

wrap('#mydiv').cool(); 

您可以随时致电wrap.fn原型将被更新。

但是,请注意,这不是一个真正的jQuery替代品,因为有很多我没有包含在此代码中的东西。在许多方面,wrap函数并不像jQuery的$那样先进和有用。

我希望这会有所帮助。

+1

谢谢...它帮了我很多.. 。如何设置这个选项? –

+2

你是否愿意评论每个部分,解释你为什么选择这样做?现在它只是代码转储,函数调用彼此并创建实例。这不是很自我解释 – vsync

相关问题