如何在动态渲染的 HTML 中正确调用 ES6 类实例方法

千静同学_8061

千静同学_8061

2025-12-25

672人浏览

原创

如何在动态渲染的 HTML 中正确调用 ES6 类实例方法

本文详解为何通过 `innerhtml` 设置的 `onclick` 无法访问类实例方法(如 `this.setchange()`),并提供基于事件监听器与词法作用域的现代解决方案。

在使用 ES6 模块和面向对象 JavaScript 开发时,一个常见误区是:试图通过内联 HTML 属性(如 onclick)直接调用类实例的方法。例如,在 render() 中拼接字符串并赋值给 innerHTML:

<input type="button" onclick="this.setChange()" value="Click here">

这段代码看似合理,实则存在两个根本性问题:

  1. this 指向错误:在 onclick 属性中,this 始终指向触发事件的 DOM 元素(即 ),而非 WriteReview 实例。因此 this.setChange() 报错 TypeError: this.setChange is not a function。

  2. 作用域隔离:onclick 属性执行的是全局作用域下的 JavaScript 表达式,无法直接访问模块内定义的局部变量或类实例上下文。即使将方法挂载到 window,也违背模块封装原则,且存在命名污染和内存泄漏风险。

✅ 正确做法是:避免内联事件处理,改用 addEventListener + 箭头函数(或显式绑定),以保留类实例的词法作用域。

JavaScript 测试模式
JavaScript 测试模式

使用 Jest、Vitest 和 Testing Library 实施全面的测试策略,包括单元测试、集成测试和端到端测试,涵盖模拟、测试夹具和测试驱动开发。在编

下载

以下是推荐的 render() 实现方式:

render() {
  const button = document.createElement('input');
  button.type = 'button';
  button.value = 'Click here';

  // 使用箭头函数自动绑定 this 到当前 WriteReview 实例
  button.addEventListener('click', () => {
    this.setChange();
  });

  this.element.append(button);
}

或者更简洁地使用 Object.assign(如原答案所示):

render() {
  const button = Object.assign(document.createElement('input'), {
    type: 'button',
    value: 'Click here'
  });

  button.addEventListener('click', () => this.setChange());
  this.element.append(button);
}

⚠️ 注意事项:

  • 不要使用 innerHTML += ... 或 element.innerHTML = ... 动态插入含内联事件的 HTML —— 它会销毁已有节点、重置状态,并丢失事件监听器;
  • 若需批量渲染多个交互元素,建议统一委托事件(event delegation),但单个组件内直接绑定更清晰安全;
  • 确保 script.js 正确导出/导入(如示例中 export class WriteReview 与 import { WriteReview } 匹配),且 HTML 中 <script type="module"> &#21152;&#36733;&#26080;&#36328;&#22495;&#38382;&#39064;&#12290;</script>

最终效果:点击按钮后,setChange() 被正确调用,this.rating 成功更新为 "3",控制台输出可验证状态变更。这种方式既符合现代 Web 标准,又保障了代码的可维护性与健壮性。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.17

305

5

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.04

406

5

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.24

395

12

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.05

7815

14

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

382

13

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

2026.04.09

384

30

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

2026.04.17

263

15

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1938

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

3184

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习