Javascript对象设计

Javascript对象设计,javascript,Javascript,在Javascript中,我想创建两个类:一个节点和一个节点列表。节点包含一些琐碎的属性;节点列表包含指向节点的指针,多个节点列表可以包含相同的节点。以下是正确的(过于简单的)设计吗 我甚至需要这些.prototype.set函数吗?在控制台中玩,似乎我可以只做一个节点。x=10。谢谢。不,您不需要这些函数,除非您需要某种基于回调的系统,在这种系统中,当值更改时,应该执行函数。正如您所发现的,您可以直接访问和分配属性。不,您不需要这些函数,除非您需要某种基于回调的系统,在这种系统中,当值更改时,

在Javascript中,我想创建两个类:一个节点和一个节点列表。节点包含一些琐碎的属性;节点列表包含指向节点的指针,多个节点列表可以包含相同的节点。以下是正确的(过于简单的)设计吗


我甚至需要这些
.prototype.set
函数吗?在控制台中玩,似乎我可以只做一个
节点。x=10
。谢谢。

不,您不需要这些函数,除非您需要某种基于回调的系统,在这种系统中,当值更改时,应该执行函数。正如您所发现的,您可以直接访问和分配属性。

不,您不需要这些函数,除非您需要某种基于回调的系统,在这种系统中,当值更改时,应该执行函数。正如您所发现的,您可以直接访问和分配属性。

Javascript对象属性可以从任何地方访问,即ie。没有真正的私有变量,因此以这种方式定义getter setter方法是毫无意义的。如果您想要私有变量或类似的行为,请阅读此

Javascript对象属性可以从任何地方访问,即ie。没有真正的私有变量,因此以这种方式定义getter setter方法是毫无意义的。如果您想要私有变量或类似行为,请阅读此

这取决于您是否试图以OOP方式强制封装x和y。javascript与Java(例如Java)的一个不同之处在于它本身并不强制使用私有变量。通常,声明某个变量/方法应为私有的常用方法是用下划线命名。因此,如果您实际上试图在这里强制实施OOP概念,那么像这样声明x和y:

function Node(name, x, y) {
  this.name = name;
  this._x = x;
  this._y = y;
}
然后留下你的二传手。如果您不想对您的节点强制执行某种x和y封装,那么继续吧,不要提供它们,只需在需要获取/设置x或y时使用Node.x/Node.y即可


请记住,这只是一个命名约定,当这个脚本运行时,_x和x一样可见。这将取决于您和与您一起工作的任何程序员来实施。

这取决于您是否试图以OOP方式实施x和y的封装。javascript与Java(例如Java)的一个不同之处在于它本身并不强制使用私有变量。通常,声明某个变量/方法应为私有的常用方法是用下划线命名。因此,如果您实际上试图在这里强制实施OOP概念,那么像这样声明x和y:

function Node(name, x, y) {
  this.name = name;
  this._x = x;
  this._y = y;
}
然后留下你的二传手。如果您不想对您的节点强制执行某种x和y封装,那么继续吧,不要提供它们,只需在需要获取/设置x或y时使用Node.x/Node.y即可


请记住,这只是一个命名约定,当这个脚本运行时,_x和x一样可见。这将取决于您和您合作的任何程序员来实施。

不确定您的意图是什么(setter没有getter?),但您可能对私有变量感兴趣。要实现私有变量的效果,请从以下内容开始:

function Guy(name) {
    var _name = name;

    this.getName = function(){ return _name; }
    this.setName = function(n) { _name = n; }
}

var g = new Guy("Bob");
alert(g.getName()); // works
alert(g._name); // doesn't work

(事实上,在这个简单的示例中,您甚至不需要变量
\u name
;getName和setName可以关闭函数参数
name

不确定您的意图是什么(setter没有getter?),但您可能对私有变量感兴趣。要实现私有变量的效果,请从以下内容开始:

function Guy(name) {
    var _name = name;

    this.getName = function(){ return _name; }
    this.setName = function(n) { _name = n; }
}

var g = new Guy("Bob");
alert(g.getName()); // works
alert(g._name); // doesn't work

(事实上,在这个简单的示例中,您甚至不需要变量
\u name
;getName和setName可以关闭函数参数
name

关于x和y,实际上没有什么私事。关于典型的oojs私有状态模式,请参见我的答案。x和y实际上没有私有性。请参阅我对典型oojs私有状态模式的回答。false,您可以使用关闭构造函数中定义的局部变量的实例函数来影响私有变量。yes。这就是为什么我提到了真正的私有变量,就像在作为一种语言支持的私有变量中一样,感谢您花时间解释您个人对“真正的私有变量”的定义。不管怎样,downvote仍然存在,因为您的声明是,getter/setter在这个琐碎的观点上是毫无意义的。在oojs中,getter/setter当然不是毫无意义的。@gWiz我同意。我并不是说在OOJ中,getter和setter本身是毫无意义的。但在问题中给出的例子中,它们的使用方式毫无意义。我将修改答案以澄清此错误,您可以使用关闭构造函数中定义的局部变量的实例函数来影响私有变量。是。这就是为什么我提到了真正的私有变量,就像在作为一种语言支持的私有变量中一样,感谢您花时间解释您个人对“真正的私有变量”的定义。不管怎样,downvote仍然存在,因为您的声明是,getter/setter在这个琐碎的观点上是毫无意义的。在oojs中,getter/setter当然不是毫无意义的。@gWiz我同意。我并不是说在OOJ中,getter和setter本身是毫无意义的。但在问题中给出的例子中,它们的使用方式毫无意义。我将修改答案以澄清这一点