Javascript 当我克隆对象时,会显示一条错误消息

Javascript 当我克隆对象时,会显示一条错误消息,javascript,object,Javascript,Object,首先,下面是我自己的javascript库的代码 (function() { var lib = { elems: [], getElem: function() { var tmpElem = []; for (var i = 0; i < arguments.length; i++) tmpElem.push(document.getElementById(argum

首先,下面是我自己的javascript库的代码

(function() {
    var lib = {
        elems: [],
        getElem: function() {
            var tmpElem = [];
            for (var i = 0; i < arguments.length; i++)
                tmpElem.push(document.getElementById(arguments[i]));
            this.elems = tmpElem;
            tmpElem = null;
            return this;
        },
        html: function(txt) {
            for (var i = 0; i < this.elems.length; i++)
                this.elems[i].innerHTML = txt;
            return this;
        },
        style: function(prob, val) {
            for (var i = 0; i < this.elems.length; i++)
                this.elems[i].style[prob] = val;
            return this;
        },
        addEvent: function(event, callback) {
            if (this.elems[0].addEventListener) {
                for (var i = 0; i < this.elems.length; i++)
                    this.elems[i].addEventListener(event, callback, false);
            } else if (this.elems[0].attachEvent) {
                for (var i = 0; i < this.elems.length; i++)
                    this.elems[i].attachEvent('on' + event, callback);
            }
            return this;
        },
        toggle: function() {
            for (var i = 0; i < this.elems.length; i++)
                this.elems[i].style.display = (this.elems[i].style.display === 'none' || '') ? 'block' : 'none';
            return this;
        },
        domLoad: function(callback) {
            var isLoaded = false;
            var checkLoaded = setInterval(function() {
                if (document.body && document.getElementById)
                    isLoaded = true;
            }, 10);
            var Loaded = setInterval(function() {
                if (isLoaded) {
                    clearInterval(checkLoaded);
                    clearInterval(Loaded);
                    callback();
                }
            }, 10);
        }
    };

    var fn = lib.getElem;
    for(var i in lib)
        fn[i] = lib[i];

    window.lib = window.$ = fn;
})();
但是当我更新了自己库的代码时,我添加了

var fn = lib.getElem;
for(var i in lib)
   fn[i] = lib[i];
以这种方式使用元素选择器

$('box').html('Welcome to my computer.');
但是当添加更新的代码来克隆lib对象时,问题开始出现了
TypeError:$(…)。html不是一个函数

现在我想像这样使用元素选择器

$('box').html('Welcome to my computer.');
而不是

$.getElem('box').html('Welcome to my computer.');

虽然我不知道你想用这些额外的行来实现什么,但是仅仅通过阅读代码,
lib.getElem
没有一个名为
html

lib


因此,只需
var fn=lib应该很好。

您创建了一个变量fn,该变量引用了“getElem”,但由于fn不是lib对象上的一个属性,因此这意味着当getElem引用“this”时,它将是您的全局对象,这是一个适当的窗口

拆下以下3条管路

var fn = lib.getElem;
for(var i in lib)
   fn[i] = lib[i];
然后再这样做

window.$ = function () { return lib.getElem.apply(lib, arguments); };

这将允许将getElem调用为$,但将“lib”维护为上下文。

实现这一点的方法还有很多,但根本原因在于您的
getElem()
函数:
返回此值

$
是对该函数的引用。如果调用
$()
,它将作为函数而不是方法调用。因此,
指的是
窗口
窗口
当然没有
html()
功能


您可以执行
返回lib
来解决这个问题。

谢谢你的回答,我想要的是使用lib选择器,使用这个表单
$('box').html('Welcome to my computer')
改为此表单
$.getElem('box').html('Welcome to my computer')。但不幸的是,您的方式不起作用。谢谢,但是当使用
$('box').html('Welcome to my computer'),向我显示错误消息
类型错误:$(…)未定义
。小查询,为什么在此处使用return关键字
return lib.getElem.apply(lib,arguments)
这是否用于返回getElem方法中存在的语句(
return this;
)?是。如果您不这样做,您将无法调用ex.html函数“$('box').html(..)”。谢谢您的回答,您能告诉我一个简单的例子吗。恐怕我不明白,举个什么例子?你可以简单地用
getElem:function(){…return this;}
替换
getElem:function(){…return lib;}
,如果你是这个意思的话。
window.$ = function () { return lib.getElem.apply(lib, arguments); };