2011-01-27 57 views
5

所以,第一個問題 - 請溫和。如何設置在console.log中返回的JavaScript對象名稱?

我正在與一些來自各種非web編程背景的其他開發人員合作開發一個JavaScript重型項目,並且我們決定嘗試在我們的JavaScript僞代碼類中使用公共和私有方法和屬性,純粹作爲良好的編碼習慣(即我們知道它沒有實際的優勢或安全性)

我們已經玩弄了幾種不同的公開方式&私人(即使用局部範圍變量和功能的特權方法公共消費),我們現在已經決定讓我們的JavaScript類構造函數實際返回一個僅表示其公共接口的對象,實際上隱藏了其他所有內容。

下面是一個例子:

function MyObject() 
{ 
    var _this = this; 

    this._privateProperty = 'somevalue'; 

    this._privateMethod = function() 
    { 
    // Do Something 
    } 

    this.public = 
    { 
    publicProperty : _this._privateProperty, 
    publicMethod : function(){ return _this.privateMethod() } 
    } 

    return this.public; 
} 

哪些實例化時,並記錄在Chrome:

var obj = new MyObject(); 
console.log(obj); 

輸出:

> Object 
    > publicMethod: function(){ return _this.privateMethod() } 
    > publicProperty: "somevalue" 
    >__proto__: Object 

現在我的問題: 因爲正在返回公衆接口從構造函數作爲新的對象,當你console.log你會的請注意,它將自己標識爲> Object - 而如果我們不返回該公共接口,則會將其標識爲> MyObject

理想情況下,我們希望將後者顯示用於調試目的,並且我知道如何訪問_this.constructor.name的配置文件的「MyObject」名稱,但不知道如何設置它以使其以這種方式識別。

有誰知道如何手動設置?

注意
我知道這是在某些方面的JavaScript約定的私生子,並試圖以適應一個圓孔方釘,但我們發現它是完成什麼很明顯的和可讀的方式,我們試圖去做。我願意提供關於如何用不同設計來實現這一點的建議,但我最終正在尋找符合我們當前設計的答案。

+0

我有點驚訝,看到你收到了返回值。必須是因爲它是構造對象的屬性。不知道。無論如何,你正在返回一個普通的Object,所以這就是開發者工具可能會報告的內容。如果你正在尋找一個適合你設計的答案,我想我不得不問你允許什麼樣的設計偏差? – user113716 2011-01-27 21:40:49

+0

...關於返回值,我認爲當用`new`調用構造函數時忽略它。看起來它會返回任何類型的對象。 – user113716 2011-01-27 21:49:57

+0

那麼,我們確實認爲在一個命名對象中擁有所有的公共接口都是新穎的 - 這樣我們實際上可以對類的公共方法和屬性進行內部引用。我希望在公開場合「哦,是的,只是返回object.name = _this.constructor.name」 - 但我願意接受設計更改,但仍然明顯易讀:) – drewdah 2011-01-28 00:42:51

回答

2

儘管我的團隊成員以及提供解決方案的網站非常有用的用戶都非常努力,但我們已決定此設計最終無法維護,而是選擇了不太明顯的設計,但實現了相同的結果。

function MyObject() 
{ 
    var _privateProperty = 'somevalue'; 

    function _privateMethod() 
    { 
     // Do Something 
    } 

    // Public Interface 
    this.publicProperty = _privateProperty; 
    this.publicMethod = _privateMethod; 

} 

通過這種方法,我們基本上是盡一切屬性和方法的私人默認情況下,在我們的「類」的底部,我們暴露了我們要提供公開的人。我認爲大多數人都會同意,這比正常的JavaScript慣例更符合我們最初的設計,希望這意味着更容易閱讀和維護其他人。

再次感謝那些花時間嘗試提出解決方案的人。

1

這是一種-奇怪的(但後來,你可能已經:-)習慣了,但是你可以重寫與當地的一個實際的「MyObject的」構造:

function MyObject() { 
    function MyObject(p) { 
    for (var k in p) if (p.hasOwnProperty(k)) this[k] = p[k]; 
    } 

    this.public = new MyObject({ 
    publicMethod: function() { /* whatever */ }, 
    publicProperty: "something" 
    }); 
    return this.public; 
} 

顯然你可以將大部分代碼分解出來,這樣你就可以擁有一個函數,給定一個函數來爲特定的類執行初始化,將爲你設置所有的代碼。 (必須維護一個系統,像你建議的而不是一些庫支持來處理細節看起來像一件真正的瑣事,而且長期以來很難繼續工作,甚至更難以改變。)

2

你應該可以設置obj的'toString'功能。例如。

obj.constructor.prototype.toString = function() { return "MyObject"; } 

這將使console.log顯示'MyObject'而不是Object。