2011-05-03 67 views
0

在Javascript中,我想创建两个类:一个节点和一个节点列表。一个节点包含一些微不足道的属性;节点列表包含指向节点的指针,并且多个节点列表可以包含相同的节点。以下是正确的(简单)设计吗?Javascript对象设计

function Node(name, x, y) { 
    this.name = name; 
    this.x = x; 
    this.y = y; 
} 

Node.prototype.setX = function(x) { 
    this.x = x; 
}; 

Node.prototype.setY = function(y) { 
    this.y = y; 
}; 

function Nodelist() { 
    this.list = []; 
} 

Nodelist.prototype.addNode = function(node) { 
    this.list.push(node); 
}; 

var a = new Node('stack', 0, 0); 
var b = new Node('overflow', 0, 0); 
var l = new Nodelist(); 
var m = new Nodelist(); 
l.addNode(a); 
l.addNode(b); 
m.addNode(a); 

我是否还需要这些.prototype.set函数?在控制台中玩耍,似乎我可以做一个node.x = 10。谢谢。

回答

3

不确定你的意图是什么(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 

(事实上,在这个简单的例子,你甚至不需要变量_name;的getName和setName可以关闭在函数参数name );

2

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

1

Javascript对象属性可以从任何地方访问,即。没有真正的私有变量,所以用这种方式定义getter setter方法是毫无意义的。如果你想要私有变量或类似的行为,请阅读http://javascript.crockford.com/private.html

+0

false,您可以使用关闭在构造函数中定义的局部变量的实例函数来影响私有变量。 – 2011-05-03 18:19:44

+0

是的。这就是为什么我提到*真正的私有变量*,因为作为语言功能支持的私有变量 – z33m 2011-05-03 18:23:14

+0

感谢您花时间解释您对“真正的私有变量”的个人定义。无论如何,downvote停留,因为你基于你的声明,即getters/setter在这个微不足道的观点上毫无意义。 getter/setters在oojs中肯定不是毫无意义的。 – 2011-05-03 19:10:56

0

这取决于你是否试图以OOP方式强制封装x和y。 JavaScript与JavaScript不同的一种方式是,例如,Java不是固有地强制执行私有变量。通常,将一些变量/方法声明为私有的常用方法是用下划线对其进行命名。所以,如果你确实想在这里执行OOP概念,然后声明x和y是这样的:

function Node(name, x, y) { 
    this.name = name; 
    this._x = x; 
    this._y = y; 
} 

然后让你的制定者。如果你没有试图强制x和y封装到你的Node,那么继续,不要提供它们,只需要使用node.x/node.y当你需要获取/设置x或y 。

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

+1

对_x和_y没有任何实际的隐私。请参阅我对典型的oojs私人状态模式的回答。 – 2011-05-03 18:18:16

+0

@gWiz,很好的答案 – Dave 2011-05-03 18:35:15