50

これは、Google Chrome デバッガーで私を悩ませてきたものであり、解決する方法があるかどうか疑問に思っていました。

多くのオブジェクト指向 JS ( Jooseフレームワークを使用) を使用して大規模な Javascript アプリケーションに取り組んでおり、コードをデバッグすると、すべてのクラスに無意味な初期表示値が与えられます。私の言いたいことを理解するには、Chrome コンソールでこれを試してください。

var F = function () {};
var myObj = new F();

console.log(myObj);

出力は、展開して のすべてのプロパティを表示できる 1 行である必要がありますmyObjが、最初に表示されるのは▶ F.

私の問題は、OO フレームワークのために、インスタンス化されたすべてのオブジェクトが同じ 'name' を取得することです。これを担当しているように見えるコードは次のようになります。

getMutableCopy : function (object) {
    var f = function () {};
    f.prototype = object;
    return new f();
}

つまり、デバッガーでは、初期ビューは常に▶ f.

さて、Joose がオブジェクトをインスタンス化する方法(getMutableCopy...?)については何も変更したくありませんが、独自の名前を提供できるようにこれに追加できるものがあれば、それは素晴らしいことです。

私が見たが、どこにも行けなかったいくつかのこと:

> function foo {}
> foo.name
  "foo"
> foo.name = "bar"
  "bar"
> foo.name
  "foo"    // <-- looks like it is read only
4

11 に答える 11

83
Object.defineProperty(fn, "name", { value: "New Name" });

トリックを行い、最もパフォーマンスの高いソリューションです。評価もありません。

于 2015-10-11T17:14:16.790 に答える
5

醜いですが、eval() 経由でごまかすことができます:

function copy(parent, name){
  name = typeof name==='undefined'?'Foobar':name;
  var f = eval('function '+name+'(){};'+name);
  f.prototype = parent;
  return new f();
}

var parent = {a:50};
var child = copy(parent, 'MyName');
console.log(child); // Shows 'MyName' in Chrome console.

注意: 関数名として有効な名前のみを使用できます!

補遺:evalすべてのオブジェクトのインスタンス化で ing を回避するには、キャッシュを使用します。

function Cache(fallback){
  var cache = {};

  this.get = function(id){
    if (!cache.hasOwnProperty(id)){
      cache[id] = fallback.apply(null, Array.prototype.slice.call(arguments, 1));
    }
    return cache[id];
  }
}

var copy = (function(){
  var cache = new Cache(createPrototypedFunction);

  function createPrototypedFunction(parent, name){
    var f = eval('function '+name+'(){};'+name);
    f.prototype = parent;
    return f;
  }

  return function(parent, name){
    return new (cache.get(name, parent, typeof name==='undefined'?'Foobar':name));
  };
})();
于 2011-05-06T08:03:38.737 に答える
2

これで問題が完全に解決するわけではありませんが、クラスのプロトタイプで toString メソッドをオーバーライドすることをお勧めします。例えば:

my_class = function () {}
my_class.prototype.toString = function () { return 'Name of Class'; }

コンソールに my_class のインスタンスを直接入力すると、元のクラス名が表示されますが (これについては何もできないと思います)、エラー メッセージにナイスな名前が表示されます。非常に役立ちます。例えば:

a = new my_class()
a.does_not_exist()

「TypeError: クラスのオブジェクト名にメソッド 'does_not_exist' がありません」というエラー メッセージが表示されます。

于 2012-12-04T19:32:56.500 に答える
0

通常、次window[name]のように使用します

var name ="bar"; 
window["foo"+name] = "bam!"; 
foobar; // "bam!"

次のような関数につながります。

function getmc (object, name) { 

    window[name] = function () {}; 
    window[name].prototype = object; 
    return new window[name](); 

}

しかしその後

foo = function(){}; 
foobar = getmc(foo, "bar"); 
foobar; // ▶ window
foobar.name; // foo
x = new bar; x.name; // foo .. not even nija'ing the parameter works

また、return ステートメント ( ) を評価できないため、eval("return new name()");行き詰まっていると思います

于 2011-05-05T15:25:57.677 に答える