js如何扩展方法
假设有如下js代码,用于修改html元素一些方法
var $=function(o){
var _o=document.getElementById(o);
return {
setAttr:function(a,b){
_o[a]=b
},
setCss:function(a,b){
_o.style[a]=b;
}
};
};
这样通过$("div1").css("..","..")可以修改元素的css,
但如果我想在$中扩展一个新的方法html(),目的是修改元素的innerHTML属性,
如:$("div1").html("123");
在不改动原来的$函数的情况下如何通过prototype、extend或其他方式扩展?
------解决方案--------------------
var el = function(dom){
this.dom = dom;
};
el.prototype = {
destroy: function(){this.dom = null},
setAttr: function(a, b){this.dom[a] = b},
setCss: function(a, b){this.dom.style[a] = b}
};
var $ = function(o){
return new el(document.getElementById(o));
};
$('xxx').setAttr('x', 'y');
要扩展的话只要扩展el类就OK。比如
el.prototype.html = function(x){this.dom.innerHTML = x}
这些只提供一个参考,它的缺点:
1.每次$都会生成一个el对象,可能会消耗内存。
2.el的每个方法中没对dom检查,可能会抛出异常。
你可以自行设计。
------解决方案--------------------模仿jquery方式:
var $=function(o){
_o=document.getElementById(o);
var fn = {};
for(var i in $.fn) {
fn[i]= function(){
$.fn[i].call(_o);//更改调用者为html标签
}
}
return fn;
};
$.fn = {
setAttr:function(a,b){
this[a]=b
},
setCss:function(a,b){
this.style[a]=b;
}
}
$.fn.html = function(a){//扩展html方法
this.innerHTML = a;
}