簡體   English   中英

如何設置在console.log中返回的JavaScript對象名稱?

[英]How can I set the JavaScript object name that gets returned in a console.log?

那么,首先要問一下 - 請保持溫和。

我正在與一些來自各種非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訪問_this.constructor.name的“MyObject”名稱,但不知道如何設置它以使其以這種方式識別。

有誰知道如何手動設置這個?

注意
我知道這在某種程度上是JavaScript慣例的混亂,並試圖在圓孔中安裝方形釘,但我們發現它是一種非常明顯和可讀的方式來完成我們想要做的事情。 我願意接受有關如何使用不同設計實現此目的的建議,但我最終會尋找適合我們當前設計的答案。

您應該能夠設置obj的'toString'功能。 例如

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

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

盡管我的團隊成員以及本網站提供解決方案的非常有用的用戶做出了勇敢的努力,但我們認為這種設計最終無法維護,而是選擇了一種不那么明顯的設計,但卻取得了相同的結果。

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

    function _privateMethod()
    {
        // Do Something
    }

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

}

通過這種方法,我們基本上默認將每個屬性和方法設為私有,並且在我們的“類”的底部,我們公開了我們想要公開的那些。 我認為大多數人都同意這比普通的JavaScript慣例更符合我們的初始設計,這有望意味着它更易於閱讀和維護。

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

這有點奇怪(但是,你現在可能已經習慣了:-)但你可以用本地覆蓋實際的“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;
}

很明顯,你可以將大部分代碼分解出來,這樣你就可以擁有一個函數,給定一個函數來執行特定類的初始化,將為你設置所有這些。 (必須維持一個類似於你提議的系統,如果沒有一些圖書館支持來處理細節,這似乎是一項真正的苦差事,長期是一件非常難以繼續工作的事情,甚至更難改變。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM