2017-03-27 1 views
1

Personに定義されているプロパティのゲッターを追加しようとしていますので、test.fullNameを実行できます。問題は、ログにtest.fullNameと記録されているとき、それは未定義です。なぜゲッターは適切に機能しますか?なぜこの物件の仕事はゲッターではありませんか?

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

Object.defineProperty(Person, 'fullName', { 
    get: function(){ 
     return this.name +' '+ this.surname 
    } 
}); 

var test = new Person("test", "test", 9999); 
console.log(test.fullName); 

答えて

5

Personプロトタイププロパティでプロパティを定義する必要があります。すべてのインスタンスで継承されます。

Object.defineProperty(Person.prototype, 'fullName', { 
    get: function() { 
     return this.name +' '+ this.surname 
    } 
}); 

ちょうどPersonにプロパティを追加すると静的になります。 Person.prototypeで行う必要があります。 MDNで詳細を読むことができます。リンクあたり:

プロトタイプは、JavaScriptオブジェクトは、すべてPersonインスタンスは、そのようなfullNameように、すべてのプロパティを継承Person.prototypeのプロパティを定義するために、別の

したがって一方から特徴を継承するメカニズムです。

また、セミコロンの代わりにカンマを使用しています。カンマではなく、ステートメントを終了するには、セミコロンを使用します。

this.name = name; 
this.surname = surname; 
this.yearOfBirth = yearOfBirth; 
+0

助けてくれてありがとう!プロトタイプの説明。 –

4

あなたはPersonfullNameプロパティを定義しています。それはインスタンスから継承されていますので、あなたは、Person.prototypeでそれを定義する必要があります。

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

 
Object.defineProperty(Person.prototype, 'fullName', { 
 
    get: function() { 
 
     return this.name + ' ' + this.surname 
 
    } 
 
}); 
 

 
var test = new Person("test", "test", 9999); 
 
console.log(test.fullName);


サイドノート:Personコンストラクタのように、あなたはセミコロンを持つべきでコンマを使用しないでください。を私は上記のように修正しました。

+0

@AndrewLi:?スニペットを追加したときの意味ですか? :-) –

+0

@AndrewLi::-)質問を閉じるためのdupetargetがあるのだろうか... –

+0

こんにちは@ T.J.Crowderがあなたの助けに感謝します!そして少し説明します。 –

0

プロトタイプで定義します。

Object.defineProperty(Person.prototype, 'fullName', { 
    get() { 
     return `${this.name} ${this.surname}`; 
    } 
}); 
関連する問題