js面向对象开发,如何简明优雅地定义私有成员变量?

(1)背景

用js进行面向对象开发。

按照对象的理念定义不同的对象构造器(用new语法生成对象的function)。

有两种形式定义公有成员函数:

(1.1) 在构造器内部定义


this.func1 = function() {...}

(1.2) 在原型上定义


    构造器名.prototype.func1 = function() {...}

对于前者,func1会在每个实例中存在相同的东东,没有必要。因此JS“标准的”面向对象设计时,通常采用后者的形式。


(2)后者的示例 / 产生的问题


https://img2.mukewang.com/5c4a9e470001edb803280566.jpg

上面的代码是2种常见的功能实现: 

func1 :递归函数(比如解析树状结构)。其中需要变量保存中间结果。


    如果递归很深,变量很多的话,无疑每次递归都要动态生成非常多的局部变量。

    如果func1函数被频繁调用,局部变量对资源的占用就成为问题。

         

onMouseMove: 监控鼠标移动,这种功能太常见,不多说。


    同上,局部变量被大量生成,内存使用有问题。极端情况将产生动作卡顿。

(3)解决思路 / 困难

将局部变量的定义从函数体中抽出,放到构造器中,这样就不用反复定义,统统使用同一个变量即可。

原型函数只能访问构造器中的公有成员变量(this.xxx),而不能访问构造器中过的局部变量(var XXX)。

将局部变量定义为公有成员变量,可以解决变量不断增加的问题。

但是,变成公有成员变量意味着向外部公开了访问接口,且这个接口大多无实际含义。

从面向对象的“封装性”角度,无疑这种解决思路“按了葫芦起了瓢”


(4)请教

如何解决示例代码中,原型函数产生大量局部变量的问题。

当然,要求简洁,优雅。


萧十郎
浏览 498回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript