假设我要创建一个名为“Vertex”的对象。通常,在Java中我会这样做:
public class Vertex {
// member variables
public data;
private id;
// member methods
public Vertex() { /* default constructor */ }
public getID() { return id; }
}
现在,我将如何在JavaScript中执行此操作?我想保留私人与公众?这是我到目前为止所设置的,但我认为它不对,我从未在JavaScript中处理过OOP。
/**
* Vertex constructor.
*/
function Vertex(object) {
data = object;
id = object.getCode(); // each Vertex will have a unique id which will be the city code
};
Vertex.prototype = (function() {
// Private Members here
// Public Members inside return
return {
constructor : Vertex,
getID : function() {
return (id);
}
};
我对原型并不熟悉,但我正在努力学习。这是正确的方法吗?如果不是,我基本上试图完成上述Java代码所做的事情,但是在JavaScript中完成。
答案 0 :(得分:4)
http://robertnyman.com/2008/10/14/javascript-how-to-get-private-privileged-public-and-static-members-properties-and-methods/以极其痛苦的细节解释它。在你的情况下......
// Constructor
function Vertex (data) {
// Private
var id = 1;
// Privileged
this.getID= function () {
return id;
};
// Public
this.data = data;
}
// Public
Vertex.prototype.getData = function () {
return this.data;
};
// Static property
Vertex.static = "something";
答案 1 :(得分:2)
有许多方法可以使类/实例系统与您在其他语言中使用的类似,而不是JavaScript对原型的奇怪实现。每个人都没有一种单独接受的方式,为了方便和性能,还有许多可能的权衡取舍。有关不同公共类/实例模型的讨论,请参阅this question。
虽然可以通过使用闭包来重现(大部分)私有变量,但我强烈建议不要使用它。通过将Java的特权模型引入JavaScript,您几乎无法获益。
Java需要将私有成员作为其安全模型的一部分来实施。但JavaScript没有针对页面内安全边界的模型,因此您不会保护您的代码免受任何人的滥用,除非您自己。所有'真正的私人'都会为你做的是快速调试和原型设计工作有点困难。
考虑使用荣誉系统模型(例如Python)。使用下划线对“伪私有”成员进行前缀,以表示不应从外部访问这些成员。
答案 2 :(得分:0)
您可以使用JSDoc将元信息(如私有成员资格)添加到您的变量和函数中。像Google closure编译器这样的工具可以使用此元信息来检查代码是否存在对这些成员的非法访问。 (以及许多其他事情)