2017-02-27 10 views
2

すべてのJavascriptオブジェクトに汎用ゲッター/セッターを定義することはできますか?すべてのJavascriptオブジェクト用の汎用ゲッター/セッター?

私がしたいことの擬似コードは以下のとおりです。基本的に、人および動物の道gettersおよびセッター to CustomGetterおよびCustomSetter

function NewPerson() 
{ 
    var person; 
    var animal; 

    var person.name = 'John Doe'; 
    console.log("Name: " + person.name); //Prints "Name: JOHNDOE CUSTOM" 

    var animal.type = 'Herbivore'; 
    console.log("Animal: " + animal.type); //Prints "Animal: HERBIVORE CUSTOM" 

    console.log("Age: " + person.age); //Prints "Age: NON EXISTANT PROPERTY"; 
} 

function CustomGetter(theObj, propertyName) 
{ 
    if(theObj.hasproperty(propertyName)) 
     return ToUpperCase(theObj.propertyName); 
    else 
    { 
     return "NON EXISTANT PROPERTY"; 
    } 
} 

function CustomSetter(theObj, propertyName, value) 
{ 
    if(theObj.hasproperty(propertyName)) 
     theObj.propertyName = value + " CUSTOM"; 
    else 
    { 
     console.log("NON PROPERTY TO SET"); 
    } 
} 

ありがとう! MDN-ドキュメントから https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Object.defineProperty(obj, 'propertyName', { 
    get: function() { return bValue; }, 
    set: function(newValue) { bValue = newValue; }, 
    enumerable: true, 
    configurable: true 
}); 
+0

var Person = function(profile={}) { var required = ["age", "name", "profession"]; var buildProfile = function(p) { for(var prop of required) { if(!(prop in p)) throw new ReferenceError ("⛔ Missing required property to profile '" +(prop+" in "+JSON.stringify(profile))+ "'"); } return p; }(profile); var anotherPrivateFunc = function() { // ... }; var publicMethods = { status: function(prop, value) { // ... }, isAdult: function() { return this.age >= 18; }, }; Object.assign(profile, publicMethods); return new Proxy(profile, { get: function(target, prop, receiver) { if(prop in target) { switch(prop) { case "name": return target[prop].toUpperCase(); break; } } return Reflect.get.apply(Object.getOwnPropertyDescriptor, arguments); } }); }; 

はObject.definePropertyを見てください//開発しますer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty – Psi

+1

オブジェクトのキャッチオールセッター/ゲッターはありません。その機能を得るには、オブジェクトをプロキシでラップする必要があります:http ://stackoverflow.com/questions/7891937/is-it-possible-to-implement-dynamic-getters-setters-in-javascript –

答えて

0

あなたがObject.definePropertyを使用して、プロパティのセッターやゲッターを作成することができます。プロトタイプでdefinePropertyを実行する場合、プロトタイプをすべてのインスタンスに適用できます。このようなもの:

Object.defineProperty(Object.prototype, 'test', { 
     get: function() { 
      return "a test"; 
     } 
    }); 

var test = new Array(2); 
console.log(test); //a test 

すべてのオブジェクトには「テスト」というプロパティがあります。

1

私は最近、そのような何かをした

+1

ありがとうございます。私はそれを見ていたとプロキシは、より多くの答えはdefinePropertyよりもそうです。プロキシを使用すると、私はまだ存在しないプロパティをキャッチすることができます。 – Water

0

必要な処理を行うには、プロキシトラップを使用する必要があります。

ドキュメント:MDN - Proxy handlers

あなたは簡単にクラスとプロトタイプとのことを行うことができますが、私はむしろ閉鎖通常

にカスタムハンドラからゲッター/セッタートラップを使用して、それはそのように見えることができます。

をします。https:
var person = new Person({age:32, name: "Water", profession:"developper"}) 

person.name  // will return WATER 
person.age  // --> 32 
person.isAdult() // --> true 

var person = new Person({age:32}) // will throw an cusotm error 
Uncaught ReferenceError: ⛔ Missing required property to profile 'name in {"age":3}' 
関連する問題