2011-05-03 91 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