IE11环境下基于原型与Object.create创建自定义实例的正确方式
优化IE11下基于原型的实例创建方案
你说得没错——你现在用Object.assign的方式确实只是做了对象合并,完全没用到原型链的特性,每个实例都会把classDefiner里的方法复制一遍,不仅冗余浪费内存,也没法利用原型共享方法的优势(比如后续修改原型方法时,所有实例能自动更新)。这种实现方式算不上是合理的原型式实例化,有很大的优化空间。
核心优化思路:用Object.create复用原型,结合Object.assign添加自定义内容
我们可以先通过Object.create(classDefiner)创建一个以classDefiner为原型的空对象,这样这个新对象会继承原型上的所有方法和属性,不会做冗余复制;再用Object.assign把实例的自定义属性和方法挂载到这个对象自身上,既保持了你想要的对象字面量可读性,又充分利用了原型链的特性。
优化后的代码示例:
var classDefiner = { x: 1, y: 2, standardFunction : function() { return this.x + this.y; } }; // 先创建原型为classDefiner的对象,再合并自定义内容 var instance = Object.assign(Object.create(classDefiner), { x: 10, z: 3, customFunctionA : function() { return this.x + this.y + this.z; }, customFunctionB : function() { return this.x / this.y; } });
为什么这个方案更好?
- 内存高效:
standardFunction只存在于classDefiner原型上,所有基于它创建的实例都会共享这个方法,不会重复复制; - 原型链特性保留:如果后续修改
classDefiner.standardFunction,所有已创建的实例调用这个方法时都会自动使用新的逻辑; - 可读性不变:依然用对象字面量分别定义原型内容和实例自定义内容,符合你的要求,不会出现冗长的逐个方法添加。
进阶:添加初始化逻辑(可选)
如果需要一些类似构造函数的初始化逻辑(比如默认值处理、参数校验),可以在原型里加一个init方法,保持对象字面量的写法:
var classDefiner = { x: 1, y: 2, // 初始化方法,接收自定义属性并合并到实例 init: function(customProps) { Object.assign(this, customProps); // 这里可以加初始化逻辑,比如默认值补全、参数校验 if (!this.z) this.z = 0; return this; }, standardFunction : function() { return this.x + this.y; } }; // 链式调用创建实例 var instance = Object.create(classDefiner).init({ x: 10, z: 3, customFunctionA : function() { return this.x + this.y + this.z; }, customFunctionB : function() { return this.x / this.y; } });
这样就完全贴合你想要的“轻量化、原型复用、对象字面量可读性”的需求了。
内容的提问来源于stack exchange,提问作者Max Cuttins
相关产品推荐
相关产品推荐

