我开始在一个相当大的 JS 项目上进行一些工作,并希望确保我干净有效地构建代码。我一直在阅读大量关于 JS 中 OOP 的不同方法,但还没有找到我真正喜欢的方法。
我很欣赏使用该prototype
属性提供的性能改进,但是当您尝试将真正的私有方法和变量添加到混合中时,它会变得相当混乱。另一方面,我真的很喜欢这种closure
方法,但我对性能下降感到不舒服。我查看了该module
模式,但发现它非常冗长。某处有快乐的媒介吗?
为了说明我正在努力解决的问题,这里有两个非常小的示例类:
积分等级:
function Point(x, y) {
this.x = x;
this.y = y;
}
// Get the x coordinate.
Point.prototype.getX = function() {
return this.x;
}
// Get the y coordinate.
Point.prototype.getY = function() {
return this.y;
}
// Get the (x, y) coordinate.
Point.prototype.getXY = function() {
return {x: this.x, y: this.y};
}
// Set the x coordinate.
Point.prototype.setX = function(x) {
this.x = x;
}
// Set the y coordinate.
Point.prototype.setY = function(y) {
this.y = y;
}
// Set the (x, y) coordinate.
Point.prototype.setXY = function(x, y) {
this.x = x;
this.y = y;
}
用户等级:
function User(guid) {
var guid = guid;
// Return the user's GUID.
this.getGuid = function() {
return guid;
}
}
在任何给定时间都可能有数千个点对象在使用中,所以我觉得这种prototype
方法是那里的最佳选择。但是,如果我想在坐标设置中添加任何验证,只需调用Point.x = <value>
. 同样,我可能会Point.getXY()
在大部分时间调用,这将为本质上是公共属性的内容构建新对象。我应该摆脱Point
类的 getter 和 setter 的概念,让它创建完全开放的公共对象吗?这在 OOP 的上下文中似乎是错误的。
对于User
该类,我想在内部存储一个 GUID,以便可以请求但从不修改它。这不能用这种prototype
方法来完成(除非我遗漏了什么),所以我被迫使用某种closure
. 我预计有数百名用户同时处于活动状态,因此性能并不像在Point
课堂上那么重要。但是,我真的不想在整个代码库中切换不同类型的 OOP 样式。
所以,作为一个普遍的问题,在 JS 中是否有一种我缺少的 OOP 方法可以让我prototype
在干净地将选择函数和变量私有化的同时使用该属性?或者,我看错了方向?我应该以不同的方式处理这个问题吗?