(1)背景
用js进行面向对象开发。
按照对象的理念定义不同的对象构造器(用new语法生成对象的function)。
有两种形式定义公有成员函数:
(1.1) 在构造器内部定义
this.func1 = function() {...}
(1.2) 在原型上定义
构造器名.prototype.func1 = function() {...}
对于前者,func1会在每个实例中存在相同的东东,没有必要。因此JS“标准的”面向对象设计时,通常采用后者的形式。
(2)后者的示例 / 产生的问题
上面的代码是2种常见的功能实现:
func1 :递归函数(比如解析树状结构)。其中需要变量保存中间结果。
如果递归很深,变量很多的话,无疑每次递归都要动态生成非常多的局部变量。
如果func1函数被频繁调用,局部变量对资源的占用就成为问题。
onMouseMove: 监控鼠标移动,这种功能太常见,不多说。
同上,局部变量被大量生成,内存使用有问题。极端情况将产生动作卡顿。
(3)解决思路 / 困难
将局部变量的定义从函数体中抽出,放到构造器中,这样就不用反复定义,统统使用同一个变量即可。
原型函数只能访问构造器中的公有成员变量(this.xxx),而不能访问构造器中过的局部变量(var XXX)。
将局部变量定义为公有成员变量,可以解决变量不断增加的问题。
但是,变成公有成员变量意味着向外部公开了访问接口,且这个接口大多无实际含义。
从面向对象的“封装性”角度,无疑这种解决思路“按了葫芦起了瓢”
(4)请教
如何解决示例代码中,原型函数产生大量局部变量的问题。
当然,要求简洁,优雅。
相关分类