アプリ版:「スタンプのみでお礼する」機能のリリースについて

javascript初心者です。
コンストラクタ(プロトタイプ)とクロージャを学んでいますが、

コンストラクタ(プロトタイプ)では、関数内にthisで変数宣言、クロージャはvarで宣言しています。
この違いの理由は何でしょうか?漠然とした質問ですみません。
thisとvarでの変数宣言の違いなど教えていただけないでしょうか?

コンストラクタ--------------------
function Person(n){
this.name = n;
}

Person.prototype.city = 'Tokyo';
Person.prototype.moveTo = function(c){
document.write(this.name + ': Moving to... ' + c + '<br>');
Person.prototype.city = c;
}


クロージャ-------------------
function Person(n, a){
var name = n;
var age = a;

return {
getName: function() {
return name;
},
setAge: function(i){
if( 0<= i ){
age = i;
}
},
getAge: function(){
return age;
}
}
}

A 回答 (2件)

JavaScript において


"this.名前" は「コンテキストオブジェクト」にプロパティを生成する構文です
"var 名前" は「関数スコープ」に変数を生成する構文です

プロパティは、対象のオブジェクトさえ分かれば、何れのスコープからでも参照できます
関数スコープの変数は、同一スコープまたは変数を束縛したクロージャーからのみ見えます

この違いを利用して、オブジェクト指向のカプセル化を表現するために、
* public メンバなら this.名前
* private メンバなら var 名前
* private へのgetter/setterなら クロージャー
を使うことが多いです。

例:
function Person(n,a) {
this.name = n; // public
var age = a; // private
this.getAge = function(){return (age>17)? 17: age}; // getter
}

var o = new Person('花子',29);
alert(o.name); // 花子
alert(o.age); // undefined
alert(o.getAge()); // 17
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

とても分かりやすく助かりました。

お礼日時:2014/03/28 09:45

「thisで変数宣言」?


this.name = n;
をnameという変数の宣言だと思っているのでしょうか?それは間違いです。
これは、プロパティーの設定です。

もし、これが変数宣言であると書いてあるような入門書を読んでいるなら、その本は捨てた方が良いと思いますよ。

プロパティについて調べると違いがわかるかと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

大きな勘違いをしていたようです。
助かりました

お礼日時:2014/03/28 09:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!