2017-05-27 1 views
0

関数でJavaScriptで「クラス」を定義し、「新しい」コマンドでその「インスタンス」を取得できます。ちょうど次のように:別の「クラス」から「新規」を呼び出してJavaScriptクラスを取得するにはどうすればよいですか?

function class_a() { 
    this.tell = function() { 
     console.log("This is a_class"); 
    } 
} 

function class_b() { 
    this.tell = function() { 
     console.log("This is b_class"); 
    } 
} 

var instance_a1 = new class_a(); 
var instance_b1 = new class_b(); 

instance_a1.tell(); 
instance_b1.tell(); 

私の質問です:別のクラスからの新しいコマンドでこれらの "クラス"を生成する方法はありますか?ただ、このように:

function typex(class_name) 
{ 
    ... 
} 

var myclass_a = new typex("class_a"); 
var myclass_b = new typex("class_b"); 

var instance_a1 = new myclass_a(); 
var instance_b1 = new myclass_b(); 

instance_a1.tell(); 
instance_b1.tell(); 
+0

すべての関数は 'new'の対象にすることができるので、' typex'は関数を返します。 –

答えて

0

typexからクラスを返しますが、関数自体を参照するだけです(typexを呼び出さない)。

オプションA:プライベートクラス

function typex(class_name) 
{ 
    function class_a() { 
     this.tell = function() { 
      console.log("This is a_class"); 
     } 
    } 

    function class_b() { 
     this.tell = function() { 
      console.log("This is b_class"); 
     } 
    } 
    if (class_name === "class_a") 
      return class_a; 
    if (class_name === "class_b") 
      return class_b; 
    throw new Error("unrecognized classname"); 
} 

オプションB:次に、コードを実行しているパブリック・クラス

function class_a() { 
    this.tell = function() { 
     console.log("This is a_class"); 
    } 
} 

function class_b() { 
    this.tell = function() { 
     console.log("This is b_class"); 
    } 
} 

function typex(class_name) 
{ 
    if (class_name === "class_a") 
      return class_a; 
    if (class_name === "class_b") 
      return class_b; 
    throw new Error("unrecognized classname"); 
} 

var myclass_a = new typex("class_a"); 
var myclass_b = new typex("class_b"); 

var instance_a1 = new myclass_a(); 
var instance_b1 = new myclass_b(); 

instance_a1.tell(); 
instance_b1.tell(); 

が出力

This is a_class 
This is b_class 
の両方のために作成します。
0

まず、私は、typex(...)を呼び出すときにキーワードnewを使用していない私はtypex.prototypeにその失敗したプロパティの検索を委任するために何でもnew typex(...) evalutesたくない紀元前に終わります。

次に、MyClass_AMyClass_Bを大文字にして、キーワードをnewとペアにする必要があることを示しました。


あなたはただそれは、これらのクラス/インスタンスのユースケースの範囲であれば、コンストラクタ関数を返すtypex持つことができます。

function typex(class_name) { 
    var classes = {}; 

    classes.class_a = function() { 
    this.tell = function() { 
     console.log('This is a_class'); 
    }; 
    }; 

    classes.class_b = function() { 
    this.tell = function() { 
     console.log('This is b_class'); 
    }; 
    }; 

    return classes[class_name]; 
} 

var MyClass_A = typex("class_a"); 
var MyClass_B = typex("class_b"); 

var instance_a1 = new MyClass_A(); 
var instance_b1 = new MyClass_B(); 

instance_a1.tell(); // "This is class_a" 
instance_b1.tell(); // "This is class_b" 

instance_a1.constructor === instance_b1.constructor; // false (which is good) 

はここでできるだけ多くのコードを再利用し、できるだけメモリ使用量を削減重くリファクタリングしたバージョンです。

function typex(class_name) { 
    var ClassConstructor = function() { 
    this.class_name = class_name; 
    }; 

    ClassConstructor.prototype.tell = function() { 
    console.log('This is ' + this.class_name); 
    }; 

    return ClassConstructor; 
} 

var MyClass_A = typex("class_a"); 
var MyClass_B = typex("class_b"); 

var instance_a1 = new MyClass_A(); 
var instance_b1 = new MyClass_B(); 

instance_a1.tell(); // "This is class_a" 
instance_b1.tell(); // "This is class_b" 

instance_a1.constructor === instance_b1.constructor; // false (which is good) 
関連する問題