2017-05-29 1 views
0

次のコードと同様に、JavaScriptオブジェクトからのリフレクションは非常に簡単です。JavaScriptのプロパティとメソッドをオブジェクトではなく「クラス」や関数から反映する方法はありますか?

var getAllMembers = function (obj) { 
    var members = {}; 
    members.properties = []; 
    members.methods = []; 

    for (var prop in obj) { 
     if (typeof obj[prop] != 'function') 
      members.properties.push(prop); 
     else members.methods.push(prop); 
    } 
    return members; 
} 

function demo_class(na, nb) { 
    this.a = na; 
    this.b = nb; 

    this.funca = function() { 
     console.log(this.a); 
    } 
    this.funcb = function() { 
     console.log(this.b); 
    } 
} 

var x = new demo_class(1234, 4321); 

var members = getAllMembers(x); 

console.log(members.properties); // [ 'a', 'b' ] 
console.log(members.methods);  // [ 'funca', 'funcb' ] 

私の質問は:クラスまたは関数から、代わりのオブジェクトからプロパティとメソッドを取得する方法はありますか?たとえば、次のようになります。

var members = getAllMembers(demo_class); // Only can get '[] []' 

答えて

0

それを説明するポストです。関数はオブジェクトです。

あなたのオブジェクトに名前付き関数コンストラクタがあるかどうかをテストし、関数で構築されたオブジェクトかどうかをテストします。

注:これは、キーワードfunction(別の名前付き関数では構築されていない)で定義されたクラスコンストラクタを使用する場合にのみ機能します。 hasOwnProperty()関数を使用しない場合、関数はプロトタイプチェーンから継承されたすべてのプロパティも取得します。

var getAllMembers = function (obj) { 
    var members = {}, toTest; 
    members.properties = []; 
    members.methods = []; 

    //construct object if argument is a constructor 
    toTest = (obj.constructor === Function) ? new obj() : obj; 

    for (var prop in toTest) { 
     if (typeof toTest[prop] != 'function') 
      members.properties.push(prop); 
     else members.methods.push(prop); 
    } 
    return members; 
} 

function demo_class(na, nb) { 
    this.a = na; 
    this.b = nb; 

    this.funca = function() { 
     console.log(this.a); 
    } 
    this.funcb = function() { 
     console.log(this.b); 
    } 
} 

var x = new demo_class(1234, 4321); 

var members = getAllMembers(x); 

console.log(members.properties); // [ 'a', 'b' ] 
console.log(members.methods);  // [ 'funca', 'funcb' ] 

var members = getAllMembers(demo_class); 
0

Javascriptではすべてがオブジェクトです。クラス概念は存在しません。したがって、新しい演算子(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new)を使用するたびに、その関数をコンストラクタとして使用するオブジェクトが返されます。

プロトタイプの概念を使用してこれに近似することができます。ここでは、コンストラクタ関数自体の代わりにプロトタイプでメソッドを定義します。ここで

function Person(name, family) { 
    this.name = name; 
    this.family = family; 
} 

Person.prototype.getFull = function() { 
    return this.name + " " + this.family; 
}; 

は、それが原型言語であるため、クラスの本当の概念は、ありません、JavaScriptでhttps://www.thecodeship.com/web-development/methods-within-constructor-vs-prototype-in-javascript/

関連する問題