6

では、ここで最初の質問です。お手柔らかにお願いします。

私は、Web プログラミング以外のさまざまなバックグラウンドを持つ他の数人の開発者と、かなり JavaScript を多用するプロジェクトに取り組んでおり、JavaScript 疑似クラスでパブリックおよびプライベート メソッドとプロパティを純粋に優れたコーディング プラクティスとして使用することにしました (つまり、実際の利点やセキュリティがないことを知っています)

public と private を実行するいくつかの異なる方法 (つまり、ローカル スコープの変数と関数を特権メソッドで使用してパブリックに使用する) をいじりました。パブリック インターフェイス、効果的に他のすべてを非表示にします。

次に例を示します。

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

> Objectここで私の質問: コンストラクターからパブリック インターフェイスを新しいオブジェクトとして返すため、console.log を実行すると、それ自体が次のように識別されることに気付くでしょう> MyObject

理想的には、後者をデバッグ目的で表示したいと考えており、コンストラクターの「MyObject」名に でアクセスする方法は知っていますが、_this.constructor.nameそのように認識されるように設定する方法がわかりません。

これを手動で設定する方法を知っている人はいますか?

:
これはある意味で JavaScript の慣習を荒らし、丸い穴に四角いペグをはめ込もうとしているのは承知していますが、私たちがやろうとしていることを達成するための非常に明白で読みやすい方法であることがわかりました。別のデザインでこれを実現する方法についての提案は受け付けていますが、最終的には現在のデザインに合った答えを探しています。

4

3 に答える 3

3

objの'toString'関数を設定できるはずです。例えば

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

これにより、console.logにObjectではなく'MyObject'が表示されます。

于 2011-01-27T22:14:49.473 に答える
3

私のチーム メンバーとソリューションを提供してくれたこのサイトの非常に有益なユーザーの勇敢な努力にも関わらず、この設計は最終的に保守不可能であると判断し、代わりに少し目立たない設計を選択しましたが、同じ結果が得られます。

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

    function _privateMethod()
    {
        // Do Something
    }

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

}

このアプローチでは、基本的にすべてのプロパティとメソッドをデフォルトで非公開にし、「クラス」の下部で公開したいものを公開します。ほとんどの人は、これが初期の設計よりも通常の JavaScript の規則に従っていることに同意すると思います。

解決策を考え出すために時間を割いてくださった方々に改めて感謝いたします。

于 2011-01-29T00:07:54.433 に答える
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;
}

明らかに、そのほとんどのコードを除外して、特定のクラスの初期化を実行する関数を指定すると、そのすべてを設定する関数を作成できます。(詳細を処理するためにいくつかのライブラリ サポートなしで提案しているようなシステムを維持しなければならないことは、本当の雑用のように思えます。長期的には、作業を続けるのは非常に困難であり、変更するのはさらに困難です。)

于 2011-01-27T21:43:50.383 に答える