开发者问题收集

如何创建具有定义的变量和函数的 JavaScript 对象?

2010-10-09
559

假设我想创建一个名为“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 中执行它。

3个回答
David Titarenco
2010-10-09

有很多方法可以创建一个类似于您在其他语言中使用的类/实例系统,这些方法都来自 JavaScript 对原型的奇怪实现。没有一种所有人都接受的方法,并且为了方便和性能,可能有很多权衡。请参阅 这个问题 ,了解有关不同常见类/实例模型的讨论。

虽然您 可以 通过使用闭包来重现(大多数)私有变量,但我强烈建议不要这样做。将 Java 的权限模型引入 JavaScript 对您几乎没有好处。

Java 需要将私有成员作为其安全模型的一部分来强制执行。但 JavaScript 没有页面内安全边界模型,因此您无法保护您的代码免受任何人(除了您自己)的滥用。 “真正的私有”能为您做的只是让快速调试和原型设计工作变得更加困难。

考虑使用荣誉系统模型(例如在 Python 中)。在“伪私有”成员前加上下划线,以表示这些成员不应从外部访问。

bobince
2010-10-09

您可以使用 JSDoc 向您的变量和函数添加元信息(如私有成员资格)。 Google closure 编译器等工具可以使用此元信息检查您的代码是否非法访问了这些成员。(以及许多其他内容)

Jan
2010-10-09