2013-04-14 66 views
0

我有一個JavaScript對象,通常需要用5+變量初始化,我不認爲每創建一個new Person對象時都會爲每個變量使用一堆setter。也許是一個構造函數?我怎樣才能把一個構造函數放入我的模塊對象?我已經找到了一個如何在JavaScript中編寫構造函數的示例,但我不確定它是否適合於此對象的設計:Constructors in JavaScript objectsJavascript模塊與構造函數

我希望能夠初始化每個Person,並設置變量人的私處:

var p = new Person(a, b, c, d, e); 

我的目標:

var Person = (function() { 

    // private 

    var name; 
    var gender; 
    var weight; 
    var location; 

    return { 
     // public 
     myfunc: function() { 

     } 
    } 

})(); 
+0

刪除'()'末 – Esailija

回答

2

像這樣:

function Person(a,b,c,d,e) { 
    this.name = a; 
    this.gender = b; 
    this.weight = c; 
    this.location = d 
    this.whatever = e; 

} 
Person.prototype.myName = function() { return this.name; } 
Person.prototype.myGender = function() { return this.gender; } 


var p = new Person("John", "male", 180, "USA", "Something"); 
p.myName(); 
p.myGender(); 

這使用JS的內部對象&繼承模型,因此您將設置單個對象的唯一變量,而in-comman函數和方法只會被指定/創建一次,然後「Person」對象的所有實例將使用這些

+0

我覺得OP想避免直接訪問'this.name'等 –

1
var Person = function(name) { 
    var gender = "male"; 

    this.changeName = function(newName) { 
     name = newName; 
    }; 

    this.displayName = function() { 
     return "<p>" + name + "</p>"; 
    }; 

    this.displayGender = function() { 
     return "<p>" + gender + "</p>"; 
    }; 
} 

var bart = new Person("Bart"); 
document.body.innerHTML = bart.displayGender(); 

該解決方案是基於「關閉」繼承模型(http://javascript.crockford.com/private.html

對於原型繼承模型,參考SReject的解決方案。請注意,它不允許真正的私人成員。

+0

僅供參考,附近有兩名失蹤報價名字變量在第9行。 – orb

+0

謝謝,我解決了它 – Bart

1

這種模式將爲您提供封裝的數據(隱藏字段),並讓您對他們如何進行公共訪問控制容易:

var PersonFactory = {  
    create: function (nm, gn, wt, loc) { 
     var name = nm, 
      gender = gn, 
      weight = wt, 
      location = loc; 

     return function (method, arg) { 
      if (method === 'isName') { 
       if (name === arg) { 
        return true; 
       } else { 
        return false; 
       } 
      } else if (method === 'isFemale') { 
       if (gender === arg) { 
        return true; 
       } else { 
        return false; 
       } 
      } 

     } 
    } 
}; 

var chris = PersonFactory.create("Chris", "male", 210, "Pluto"); 
chris('isName', 'Chris'); // returns true 
var jane = PersonFactory.create("Jane", "female", 160, "Alpha Centauri"); 
jane('isName', 'Jane'); // returns true 
jane('isName', 'Chris'); // returns false 

我希望這是你在找什麼。請記住,只有函數對象可以隱藏數據,這並不是很糟糕,因爲您可以用非常簡單的方式使用immaFunciton('methodName','args')模式訪問數據。

好運, Chirs