2

If I define and create instance of class dynamically like below:

var type = 'Animal';
window[type] = function() {};
var animal1 = new window[type]();
var animal2 = new Animal();

Then animal1 will be shown in Chrome debugger as instance of Object (but with correct properties) while animal2 will have type window.Animal.

When Animal is defined statically:

function Animal() {}

both objects are seen as instances of Animal.

How can I achieve this while defining functions dynamically (without using eval) ?

4

1 に答える 1

1

Chromeコンソールに表示される外観は、次の要素によって決定されるようです。

  1. コンストラクター関数のnameプロパティ、または
  2. コンストラクター関数が最初に割り当てられる変数名(name設定されていない場合)。

ケース#1:

var ClassA = function ClassB() {};
new ClassA();
// reports a `ClassB` object

コンストラクター関数のnameプロパティはに設定されてClassBいるため、Chromeはこれを報告します。関数nameは定義時にのみ設定可能であるため、を設定しますが、function funcName(){}設定しません。namefunc=function(){}; f.name='funcName';

ケース2:

var ClassA = function() {};
ClassB = ClassA;
new ClassB();
// reports a `ClassA` object

コンストラクターは最初にに割り当てられてClassAいたため、別の変数エイリアスで使用されている場合でも、名前がコンストラクター関数に焼き付けられているように見えます。実際、実行しても、delete window.ClassA新しく構築されたオブジェクトがClassAオブジェクトとして報告されるのを防ぐことはできません。

var ClassA = function() {};
ClassB = ClassA;
delete window.ClassA;
new ClassB();
// still reports a `ClassA` object
// even though `ClassA` is no longer a defined variable name

これは、「動的に定義された」場合に起こっていることです。最初のwindow[type] = function() {};行は、コンストラクターの結果のオブジェクトを永続的にマークして、タイプ" anonymous function that's a property of window"として識別します。

すべてのオブジェクト/プロトタイプ機能は引き続き期待どおりに機能するため、これらのコンソールの外観はプログラムの機能に影響を与えないことに注意してください。

于 2012-08-29T18:21:49.513 に答える