2017-10-19 10 views
0

誰かが、 "setFirstName"セッターメソッドが "firstName"変数を "NewFirstName"に変更した後に、自分のオブジェクト内の "fullName"変数が変更されない理由を説明できますか?私はこの問題の正解を認識していますが、私は次の解決策がうまくいかない理由について混乱しています。ここでsetterメソッドがJavaScriptオブジェクトの他の変数に影響を与えないのはなぜですか?

This is a picture showing the below snippet being run

コードです:あなただけそれが動的に更新されません、一度fullNameを計算しているので

<!DOCTYPE html> 
 

 
<html> 
 
<script> 
 

 
    var Person = function(firstAndLast) { 
 

 
     let firstName = firstAndLast.split(" ")[0]; 
 
     let lastName = firstAndLast.split(" ")[1]; 
 
     let fullName = firstName + " " + lastName; 
 

 
     // Getters 
 
     this.getFirstName = function() { 
 
      return firstName; 
 
     }; 
 
     this.getLastName = function() { 
 
      return lastName; 
 
     }; 
 
     this.getFullName = function() { 
 
      return fullName; 
 
     }; 
 

 
     // Setters 
 
     this.setFirstName = function(first) { 
 
      firstName = first; 
 
     }; 
 
     this.setLastName = function(last) { 
 
      lastName = last; 
 
     }; 
 
     this.setFullName = function(name) { 
 
      fullName = name; 
 
     }; 
 
    }; 
 

 
    debugger; 
 
    var bob = new Person('Bob Ross'); 
 

 
    console.log(bob.getFullName()); 
 
    bob.setFirstName("NewFirstName"); 
 
    console.log(bob.getFirstName()); 
 
    console.log(bob.getFullName()); 
 

 
</script> 
 

 
</html>

+0

'fullname'変数はインスタンス化中に一度評価されます。 'fullname'自体ではなく、' firstname + '' + lastname'をゲッターから返すことを望みます。 – nilobarp

答えて

2

あなたは本当にfullNameための変数、単にゲッターを望んでいない:

this.getFullName = function() { 
    return firstName + " " + lastName; 
} 

はまた、あなたの変数を維持し、手動でsetFirstNamesetLastNameの両方でそれを更新することができ

let fullName = firstName + " " + lastName; 

を削除します実際にはゲッターが行うべきことです。

+0

ご清聴ありがとうございます。この振る舞いがJavaのような他のオブジェクト指向プログラミング言語でも共通するのか、これはJavaScriptの奇妙なものなのでしょうか? – phao5814

+0

これは一般的です。 Javaでは、これはコンストラクタの 'fullName'プロパティを設定するのと同じですが、自動的には更新されません - あなたはこのコードをヒットすると、現在のようにこれらの文字列を連結します。ゲッターは私が提案したのと同じ方法でこの問題を解決するために使われます。 – UncleDave

+0

理解していただきありがとうございます。 – phao5814

関連する問題