アクセス可能性
以下のコードで、クラスの関数へのアクセス可能性を確認する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
class Person method1: -> console.log("method1") @method2: -> console.log("method2") method3 = -> console.log("method3") @method4 = -> console.log("method4") method: -> # method1() # Error, is not defined # method2() # Error, is not defined method3() # method3 # method4() # Error, is not defined method_a: -> @method1() # method1 # @method2() # Error, is not a function # @method3() # Error, is not a function # @method4() # Error, is not a function # Person.method1() # Error, is not a function Person.method2() # method2 # Person.method3() # Error, is not a function Person.method4() # method4 console.log() john = new Person() john.method1() # method1 # john.method2() # Error, is not a function # john.method3() # Error, is not a function # john.method4() # Error, is not a function console.log() john.method() console.log() john.method_a() |
各関数へのアクセス可能性は以下の通り。
定義\引用 | クラス | インスタンス | メソッド内 (@なし) |
メソッド内 (@つき) |
fnc: -> |
TypeError | ○ | ReffError | ○ |
@fnc: -> |
○ | TypeError | ReffError | TypeError |
fnc = -> |
TypeError | TypeError | ○ | TypeError |
@fnc = -> |
○ | TypeError | ReffError | TypeError |
なお、上記コードの定義部分のJavaScriptコンパイル結果は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
(function() { var Person, john; Person = (function() { var method3; function Person() {} Person.prototype.method1 = function() { return console.log("method1"); }; Person.method2 = function() { return console.log("method2"); }; method3 = function() { return console.log("method3"); }; Person.method4 = function() { return console.log("method4"); }; |
クラス・メソッド
クラス内で@つきでメソッドを定義すると、クラスメソッドになる。
1 2 3 |
class MyClass @method1: -> console.log("method1") @method2 = -> console.log("method2") |
上記のいずれもJavaScriptへのコンパイル結果は同じになる。
1 2 3 4 5 6 7 8 9 10 11 |
Person = (function() { function Person() {} Person.method1 = function() { return console.log("method1"); }; Person.method2 = function() { return console.log("method2"); }; |
クラスメソッドは、クラス内で呼び出すときでもクラス名をつける。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class MyClass @classMethod: -> console.log("Public Static") instanceMethod: -> console.log("Instance Method calling...") MyClass.classMethod() MyClass.classMethod() myObj = new MyClass() myObj.instanceMethod() # 実行結果 # Public Static # Instance Method calling... # Public Static |
publicなインスタンス・メソッド
最も多く用いる形で、クラス内でコロン(:)によって関数を定義すると、インスタンス・メソッドになる。
1 2 |
class MyClass method: -> console.log("method") |
JavaScriptへのコンパイル結果では、prototype宣言されている。
1 2 3 4 5 6 7 8 9 10 |
(function() { var MyClass; MyClass = (function() { function MyClass() {} MyClass.prototype.method = function() { return console.log("method"); }; |
同じクラスのメソッド内で呼び出すときは、@つきで。
1 2 3 4 5 6 7 8 9 10 11 12 |
class MyClass method1: -> console.log("metod1") method2: -> console.log("method2 calling...") @method1() myObj = new MyClass() myObj.method2() # 実行結果 # method2 calling... # metod1 |
privateなクラス・メソッド
クラス内でfnc = ->
のように定義すると、クラスの外からは見えないprivateなメソッドになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class MyClass publicMethod: -> console.log("Public Method calling...") privateMethod() privateMethod = -> console.log("Private Method") myObj = new MyClass() myObj.publicMethod() # myObj.privateMethod() # Type Error: is not a function # 実行結果 # Public Method calling... # Private Method |
JavaScriptコードでは、クラス内のスコープで宣言されており、外からは見えない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
MyClass = (function() { var privateMethod; function MyClass() {} MyClass.prototype.publicMethod = function() { console.log("Public Method calling..."); return privateMethod(); }; privateMethod = function() { return console.log("Private Method"); }; return MyClass; })(); |