旧浏览器环境下,如何在实例化前扩展/重写JavaScript构造函数someFunctions?
如何在旧浏览器中扩展JavaScript构造函数的实例方法?
可行性说明
完全可行。加载file_containing_someFunctions.js后,构造函数someFunctions已成为全局变量,后续加载的扩展文件可直接访问并修改它,所有操作都兼容旧浏览器(如IE6-8等ES3环境)。
两种实现方式
方式1:通过原型添加共享方法
在file_containing_extended_functions.js中,直接给构造函数的原型挂载新方法:
// 给someFunctions的原型添加DOSOMETHINGELSE方法 someFunctions.prototype.DOSOMETHINGELSE = function(parameters) { // 这里编写你的扩展逻辑 };
- 特点:该方法由所有实例共享,不会在每个实例上创建独立副本,节省内存。
- 注意:原构造函数中挂载到
this上的DOSOMETHING方法,优先级高于原型方法,不会被覆盖。
方式2:重写构造函数,添加实例专属方法
如果想和原代码模式保持一致(每个实例拥有独立的方法副本),可以重写构造函数,保留原有逻辑的同时添加新方法:
// 先保存原构造函数的引用,避免丢失原有逻辑 var OriginalSomeFunctions = someFunctions; // 重写构造函数 someFunctions = function() { // 调用原构造函数,确保原有DOSOMETHING方法被初始化到实例上 OriginalSomeFunctions.call(this); // 给当前实例添加新的DOSOMETHINGELSE方法 this.DOSOMETHINGELSE = function(parameters) { // 这里编写你的扩展逻辑 }; // 如果需要重写原有的DOSOMETHING方法,直接在此重新赋值即可 // this.DOSOMETHING = function(parameters) { // // 新的逻辑代码 // }; };
- 特点:新方法和原方法一样属于实例自身属性,完全匹配原代码的设计模式,兼容性拉满。
验证效果
按照你的加载顺序执行后,实例化的someFunctions对象会拥有DOSOMETHINGELSE方法,可直接在doTheThing中调用。
内容的提问来源于stack exchange,提问作者Fermar
相关产品推荐
相关产品推荐

