2016-08-26 9 views

答えて

0

返信するのは、getメソッドを定義したものです。 get returnに関数がある値は、それが解決する値です。

を参照してください:あなたはTest.prototype.timeを再構成するObject.definePropertyを設定するためにconsole.logはもともと定義された1とは対照的に、新しい値を出力する理由

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Object.defineProperty(Test.prototype, 'time', { 
    configurable: true, 
    get: function() { return 'A new value!'; } 
}); 

var a = new Test(); 

console.log(a.time); //A new value! 

あなたが迷っている場合は、まあ、それはですそれの新しいインスタンスを新たな価値にした新しい価値にすることです。

あなたは自分のためにこれをテストすることができます:あなたはbをインスタンス化するとき

function Test(){ 
    this.time='pat'; 
} 

// This instance will have the old values 
var b = new Test(); 

// Change value returned by Test.time by new Test instances 
Object.defineProperty(Test.prototype, 'time', { 
    configurable: true, 
    get: function() { return 'A new value!'; } 
}); 

var a = new Test(); 

console.log(a.time); // A new value! 
consoel.log(b.time); // pat 

はあなたが元の定義とインスタンスを作られました。しかし、aをインスタンス化すると、新しい定義がtimeのインスタンスが作成されたため、それが異なるのです。

+2

私はOPは、オブジェクト自体の値は試作品をチェックする前に、最初に返されなかった理由を知りたかったと思います。 – alex

+0

あなたは正しいと思います。ありがとう! – Mike

2

timeは単純なプロパティではないので、その割り当てはプロトタイプのプロパティ定義を使用します。プロトタイプのプロパティはgetterで定義されていますが、セッターはではないため、割り当てできません。あなたが厳密モード(一般的には良いアイデア)にいたなら、あなたはそれについての誤りを得るでしょう。

コンストラクタインスタンスに「自分自身の」timeプロパティを作成します。単なる割り当てではありません。それはそれを行うにはdefinePropertyを使用しています

function Test(){ 
 
    Object.defineProperty(this, "time", { 
 
    writable: true, 
 
    enumerable: true, 
 
    configurable: true, 
 
    value: 'pat' 
 
    }); 
 
} 
 

 
Object.defineProperty(Test.prototype, 'time', { 
 
    configurable: true, 
 
    get: function() { return 'test'; } 
 
}); 
 

 
var a=new Test(); 
 
console.log(a.hasOwnProperty("time")); // true 
 
console.log(a.time); //pat 
 
a.time = "updated"; 
 
console.log(a.time); //updated

関連する問題