如何制作Jquery';JavaScript中的s.html()函数

如何制作Jquery';JavaScript中的s.html()函数,javascript,jquery,Javascript,Jquery,我一直在网上寻找如何做到这一点。我正在尝试用普通JavaScript创建Jquerys.html()函数。我想重新创作,以便更好地理解它。我尝试了以下方法,但似乎没有任何效果,我只是不明白我做错了什么 let $ = function(ele) { if (ele.charAt(0) == '.' || ele.charAt(0) == '#') { let newEle = cut(ele,0); if (ele.charAt(0) == '#') ge

我一直在网上寻找如何做到这一点。我正在尝试用普通JavaScript创建Jquerys.html()函数。我想重新创作,以便更好地理解它。我尝试了以下方法,但似乎没有任何效果,我只是不明白我做错了什么

let $ = function(ele) {
    if (ele.charAt(0) == '.' || ele.charAt(0) == '#') {
    let newEle = cut(ele,0);
    if (ele.charAt(0) == '#')
        get(newEle);
    else
        return document.getElementsByClassName(newEle);
  } else
    return document.getElementById(ele);
}

$.prototype.html = function(html) {
    this.innerHTML = html;
}

$('test').html('hey');
$('.hey')[0].html('hey');
function cut(string,num) {
    let a = string.slice(0,num);
  let b = string.slice(num + 1,string.length);
  return a + b;
}
它不工作,控制台日志报告此错误:

Uncaught TypeError: $(...).html is not a function
请提前提供帮助和感谢。

因为您正在从
$
返回一个对象,所以您正在覆盖
新$
的默认行为;它不是生成新创建的对象,而是生成从
$
返回的对象

相反,您希望在数组中记住那些
getElementsByClassName
/
getElementById
调用的结果,或者存储在
this
(新创建的对象)上,然后在
html
(因为在设置新HTML的情况下,您希望循环所有匹配的元素)


旁注:由于您仍在使用ES2015+功能(
let
),您可能希望使用更简单的语法,而不是单独的
函数
声明并分配给
$。原型

class $ {
    constructor(ele) {
        // ...
    }

    html(html) {
        // ..
    }
}

这里的问题是从$function返回什么。 考虑一下:document.getElementsByClassName和document.getElementById返回dom元素,而dom元素没有.html函数。这就是为什么会出现错误


您需要返回的是一个对象、一个包装器、一个.html函数和一个对要修改的dom元素的闭包。

因此,离开您的类,我仍然对在html(html){.innerHTML=html?对不起,我仍然学到了很多东西。@JoeTheHobo-不,正如我前面所说,因为在设置新html的情况下,您希望循环所有匹配的元素,所以您将在保存在构造函数中的数组/集合上使用一个循环。当
html
收到一个参数时(因此您将其设置为setter),您应该在循环中的该数组/集中的元素上设置
innerHTML
。@JoeTheHobo-Re您删除的答案:不,非常不一样。:-)永远不要添加到
Object.prototype
。(如果您添加到其他内置原型中,请确保使用
defineProperty
,这样您就创建了一个不可枚举的属性。)re Johnny Zabala的回答是:不,没有必要放弃基于原型的解决方案(
class
也是基于原型的)。虽然返回一个关闭元素的对象是一个选项,但这不是必需的。Kay感谢您的帮助。我只需要多看一点课就能更好地理解。再次感谢。@T.J.Crowder我的答案是不要放弃基于原型的解决方案。但是,如果您试图复制JQuery,就不能使用
基本解决方案作为主要api。如果使用
,则需要使用
new
关键字,JQuery不会这样工作。您仍然可以在下面有一个类并使用prototype,但如果您是在模仿JQuery,则类不能作为api入口点。