fork download
  1. /**
  2.  * 疑似クラス getter型
  3.  *
  4.  * @version 1.0.1
  5.  * @author think49
  6.  * @url http://v...content-available-to-author-only...a.com/notebooks/javascript/Class_prototype_private-variable.html
  7.  */
  8.  
  9.  
  10. /**
  11.  * ベースとなるスーパークラス (親クラス)
  12.  */
  13. function Base (name) { // 仮引数 name はプライベート変数となる
  14. this.getName = function getName () { // プライベートメソッド
  15. return name;
  16. };
  17. }
  18.  
  19.  
  20. /**
  21.  * サブクラス1 (子クラス1)
  22.  */
  23. function Sub1 (name, message) { // 仮引数 message はプライベート変数となる
  24. this.getName = function getName () { // 親クラス(Base)のプライベートメソッドをオーバーライドする (*注釈1)
  25. return name;
  26. };
  27.  
  28. this.setName = function setName (inputName) { // プライベートメソッド
  29. name = String(inputName);
  30. };
  31.  
  32. this.getMessage = function getMessage () { // プライベートメソッド
  33. return message;
  34. };
  35.  
  36. this.setMessage = function setMessage (inputMessage) { // プライベートメソッド
  37. message = String(inputMessage);
  38. };
  39. }
  40.  
  41. Sub1.prototype = new Base('myName1-1'); // Base を継承する
  42.  
  43.  
  44. /**
  45.  * サブクラス2 (子クラス2)
  46.  */
  47. function Sub2 (message) { // 仮引数 message はプライベート変数となる
  48. this.getMessage = function getMessage () { // プライベートメソッド
  49. return message;
  50. };
  51.  
  52. this.setMessage = function setMessage (inputMessage) { // プライベートメソッド
  53. message = String(inputMessage);
  54. };
  55. }
  56.  
  57. Sub2.prototype = new Base('myName1-2'); // Base を継承する
  58.  
  59.  
  60. /**
  61.  * 出力
  62.  */
  63. function output (name, value) {
  64. print(String(name) + ': ' + String(value));
  65. }
  66.  
  67.  
  68. /**
  69.  * 検証
  70.  */
  71. function test () {
  72. var base, sub1, sub2;
  73.  
  74. base = new Base('myName1');
  75. output('base.name', base.name); // undefined
  76. output('base.getName()', base.getName()); // "myName1"
  77. output('base.hasOwnProperty("getName")', base.hasOwnProperty('getName')); // true
  78.  
  79. print('');
  80.  
  81. sub1 = new Sub1('myName2-1', 'myMessage1-1');
  82. sub2 = new Sub2('myMessage1-2');
  83.  
  84. output('sub1.getMessage()', sub1.getMessage()); // "myMessage1-1"
  85. output('sub2.getMessage()', sub2.getMessage()); // "myMessage1-2"
  86. sub1.setMessage('myMessage2-1');
  87. sub2.setMessage('myMessage2-2');
  88. output('sub1.getMessage()', sub1.getMessage()); // "myMessage2-1"
  89. output('sub2.getMessage()', sub2.getMessage()); // "myMessage2-2"
  90.  
  91. output('sub1.hasOwnProperty("getMessage")', sub1.hasOwnProperty('getMessage')); // true
  92. output('sub2.hasOwnProperty("getMessage")', sub2.hasOwnProperty('getMessage')); // true
  93.  
  94. print('');
  95.  
  96. output('sub1.name', sub1.name); // undefined
  97. output('sub2.name', sub2.name); // undefined
  98. output('sub1.getName()', sub1.getName()); // "myName2-1" (*注釈2)
  99. output('sub2.getName()', sub2.getName()); // "myName1-2"
  100. sub1.setName('myName3-1');
  101. output('sub1.getName()', sub1.getName()); // "myName3-1"
  102. output('sub2.getName()', sub2.getName()); // "myName1-2"
  103.  
  104. output('sub1.hasOwnProperty("getName")', sub1.hasOwnProperty('getName')); // true
  105. output('sub2.hasOwnProperty("getName")', sub2.hasOwnProperty('getName')); // false
  106. }
  107.  
  108. test();
  109.  
  110. /*
  111.  * (*注釈1) ECMAScript にはクラスやオーバーライドの仕組みはないので適切ではないかもしれません。ただ、クラス的な考え方でいけば「オーバーライド」にあたると思います。
  112.  * (*注釈2) 「プロパティアクセス演算子」はインスタンス生成元のプロトタイプオブジェクトの prototype を遡ってプロパティを参照します(プロトタイプチェーン)。この仕組みがオーバーライドと同じ効果を生み出しています。
  113.  */
  114.  
Success #stdin #stdout 0.26s 214464KB
stdin
Standard input is empty
stdout
base.name: undefined
base.getName(): myName1
base.hasOwnProperty("getName"): true

sub1.getMessage(): myMessage1-1
sub2.getMessage(): myMessage1-2
sub1.getMessage(): myMessage2-1
sub2.getMessage(): myMessage2-2
sub1.hasOwnProperty("getMessage"): true
sub2.hasOwnProperty("getMessage"): true

sub1.name: undefined
sub2.name: undefined
sub1.getName(): myName2-1
sub2.getName(): myName1-2
sub1.getName(): myName3-1
sub2.getName(): myName1-2
sub1.hasOwnProperty("getName"): true
sub2.hasOwnProperty("getName"): false