basyura's blog

あしたになったらほんきだす。

java っぽく

java の class っぽく定義する場合、メンバ変数を間違えて変更しちゃう事故を防ぐには引数に _ をつけるのがいいのではないだろうか。気持ち悪いけど。

function Person(name_){
  this.getName = function() {
    return name_;
  }
  this.setName = function(name) {
    name_ = name;
  }
};

var person = new Person('basyura');
print(person.getName()); //=> basyura
person.setName('baby');  //=> baby
print(person.getName());

メンバ変数と気づかずローカル変数のつもりで宣言して更新しちゃうとか。

function Person(name){
  this.getName = function() {
    return name;
  }
  this.setName = function(a_name) {
    name = a_name;
  }
  this.callName = function(msg) {
    // ★ 誤ってメンバ変数を更新 
    // ★ var name = msg + name; なら OK
    name = msg + name; 
    return name;
  }
};

var person = new Person('basyura');
print(person.getName()); //=> basyura
person.setName('baby');  //=> baby
print(person.getName());
print(person.callName('hi,')); //=> hi,baby
print(person.getName()); // hi,baby ★事故★

この場合は var で宣言してないのが問題ともいえるけど。var 宣言しない場合はメンバ変数へのアクセスだという言い方もできるなぁ。

function BPerson(name){
  var my_name = name;
  this.getName = function() {
    return name;
  }
  this.getMyName = function() {
    return my_name;
  }
};
var person = new BPerson('basyura');
print(person.getName());   //=> basyura
print(person.getMyName()); //=> basyura

よくある引数からメンバ変数への入れ替え。メンバ変数が2つになってしまう。

何がいいのかよく分からないのでコーディング規約を見てみることに。Good Parts では new じゃなくて prototype を使えってあるしなぁ。