2016-08-26 7 views
1

私はいくつかのデータをラップするオブジェクト持って維持する:私はconsole.log(obj1);を呼び出すときオブジェクトを返す独自のプロパティとメソッド

function Obj1() { 
    var _foo = 'bar' 
    this.obj2 = { 
     'b': 'c' 
    } 
    this.method = function() { 
     return _foo 
    } 
} 
var obj1 = new Obj1() 

は今、私はそれは私がobj2コンテンツオブジェクト見せたいの。私がまだobj1.methodに電話をかけて_fooの値を取得する必要があるということです。それが可能なら、どうしたらいいですか? 私はゲッターのようなものが適していると思っていましたが、どこにどのように割り当てるか分かりませんでした。私が正しく理解していれば

+1

なぜ、 'console.log(obj1.method())'ではないのですか? – Li357

+0

あなたの問題が何であるか分かりません。ゲッターを割り当てる方法は? [Object.defineProperty](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)をご覧ください。 – Thomas

+0

これで 'obj2'をログに記録しますか? 'console.log(obj1.obj2)' – Li357

答えて

1

を使用することができます。これを実現するには、Object.definePropertyを使用してください。 enumerableプロパティがデフォルトでfalseであり、プロパティがconsole.logなどに表示されないため、関数はログに記録されません。

function Obj1() { 
 
    var _foo = 'bar' 
 
    this.obj2 = { 
 
    'b': 'c' 
 
    } 
 
    
 
    Object.defineProperty(this.obj2, 'method', { 
 
    value: function() { 
 
     return _foo; 
 
    } 
 
    }); 
 
    
 
    return this.obj2; 
 
} 
 

 

 
    
 
var obj1 = new Obj1() 
 

 
console.log(obj1); 
 
console.log(obj1.method());

1

、あなたは私はあなたがmethodプロパティを非表示にしようとしている理解限り例prototype

function Obj1() { 
    this.obj2 = { 
     'b': 'c' 
    } 
} 
Obj1.prototype.method = function() { 
    return 'bar'; 
} 

var obj1 = new Obj1(); 

//prints only properties 
console.log(obj1); 

//prints method result 
console.log(obj1.method()) 
0

あなたがnew Obj1()を呼び出して以来。結果変数var obj1はクラスオブジェクトであり、関数ではありません。obj2の値を取得するには、コンソールログにobj1.obj2を呼び出す必要があります。 obj1にobj2の値を保持させたい場合そして、次のコード

function Obj1() { 
    var obj2 = { 
     'b': 'c' 
    } 
    return this.obj2; 
} 
var obj1 = Obj1(); 
console.log(obj1); 

を使用これは、コンソールログに、あなたに必要な結果が得られますが、オブジェクトはもはやクラスオブジェクトでないだろうとOBJ2の値だけを持つことになります。元のスニペットに工場をこだわり

0

は良いオプションのようになります。

function factory() { 
    var foo = 'bar'; 
    var props = { b: 'c'}; 
    var proto = { 
     method: function() { return foo; } 
    }; 
    var obj = Object.create(proto); 
    Object.assign(obj, props); 
    return obj; 
} 

var obj = factory(); 
console.log(obj); // {b: 'c'} 
console.log(obj.method()) // 'foo' 

あなたも、プライベートメンバーにアクセスして「unenumerable」方式で産卵オブジェクトのより柔軟な方法を取得するには、引数として小道具を渡すことができます。

+0

それは素晴らしいアイデアです。 クローンするには 'Object.assign()'を使うことができます:https://developer.mozilla.org/pl/docs/Web/JavaScript/Reference/Global_Objects/Object/assign;) – Argo

+0

良い点!答えを更新しています... – 36ve

関連する問題