日期:2014-05-16  浏览次数:20290 次

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;
}