2017-02-22 7 views
1

私はjavascriptライブラリを構築しています。私はPHPの__getとまったく同じようにできるようにしたいと考えています。PHPの__getなどのjavascriptクラスのデフォルト値のオーバーライド

私のライブラリには、各モデルの属性を格納するattributesプロパティがあります。今、私は.getメソッドを使用して属性を取得する必要があります。しかし、私はゲッターでそれを行うことができます。 Userが自分のモデルクラスを拡張しているとしましょう。

let instance = new User({firstname: 'John', lastname: 'Doe'}); 
console.log(instance.get('firstname')); // gives me 'John' 

私は、パラメータとして「ファーストネーム」を渡す.getメソッドを呼び出しますinstance.firstnameを行うことができるようにしたいです。 PHPでは次のようにすることができます:http://php.net/manual/fr/language.oop5.overloading.php#object.get

これは何か可能ですか?

はあなたのすべて

答えて

0

これはES 2015のクラスを使用して簡単です:

ここ
class Foo { 
    constructor() { 
    this._bar = null; 
    } 

    get bar() { 
    doStuff(); 
    return this._bar; 
    } 

    set bar (val) { 
    doOtherStuff(); 
    this._bar = val; 
    return this; 
    } 
}; 

var foo = new Foo(); 
foo.bar = 3; // calls setter function 
console.log(foo.bar); // calls getter function 

はバベルから(簡体字)出力です:これはただのクラスのためではないことを

var Foo = function() { 
    function Foo() { 
    this._bar = null; 
    } 

    _createClass(Foo, [{ 
    key: "bar", 
    get: function get() { 
     doStuff(); 
     return this._bar; 
    }, 
    set: function set(val) { 
     doOtherStuff(); 
     this._bar = val; 
     return this; 
    } 
    }]); 

    return Foo; 
}(); 

注意、任意のオブジェクトを持つことができますこれら:

var baz = { 
    get qux() { 
    // arbitrary code 
    }, 
    set qux(val) { 
    // arbitrary code 
    } 
}; 

Source.

Proxyがpolyfilledすることができないよう何をしたいEDIT


は、可能性だけネイティブES 6の環境です。

var getter = function(target, property, proxy) { 
    console.log(`Getting the ${property} property of the obj.`); 
    return target[property]; 
}; 

var setter = function(target, property, value, proxy) { 
    console.log(`Setting the ${property} property to ${value}.`); 
    target[property] = value; 
}; 

var emptyObj = {}; 

var obj = new Proxy(emptyObj, { 
    get: getter, 
    set: setter 
}); 

obj.a = 3; // logs 'Setting the a property to 3' 
var foo = obj.a; // logs 'Getting the a property of the obj' 
+0

私はすでにそれをすべて知っています。物事はダイナミクスであるということです。 'foo.bar'が' foo.get( 'bar') 'を呼び出し、' foo.baz'が 'foo.get( 'baz')'を呼び出したいとします。 –

+0

@NicolasBoisvertが更新されました。その可能性はありますが、移植性はまだありません。 –

0

ありがとうかなり単にループのプロパティを割り当てる:

ES6クラスの構文を使用して
User = function (attrs) { 
    for (var name in attrs) { 
     this[name] = attrs[name]; 
    } 
} 

User.prototype = { 
    // further methods 
} 

、 - 私は書き込み物事のポイントをこのように表示されていない認めざるを得ません。

class User { 
    constructor (attrs) { 
     for (var name in attrs) { 
      this[name] = attrs[name]; 
     } 
    } 

    // further methods 
} 

注意:2番目の構文は上にいくつかの砂糖と、最初の1で起こるまさにです。

+0

私はそれのようなものを見ましたが、その属性は常に変わるということです。あなたが示唆しているのは、オブジェクトの作成時にgetterを作成するために属性を繰り返し処理することです。 –

+0

私が完全に理解しているかどうかはわかりませんが、動的であれば、どうしてですか?プロパティオブジェクトは普通のオブジェクトです。あなたはあなたが望む方法でそれを構築することができます。 – ccprog

+0

Ah。わかりました。 1つの関数で複数の属性を扱いたいと思っていましたが、出力前にデータを変換できるゲッター関数について考えていました。私はあなたの問題のための私の例を変更します。 – ccprog

関連する問題