tmp
Friday, August 1, 2014
javascript class
javascriptでの変数、メソッドの定義の仕方について 継承を考えると面倒なので今回は無視 ##一般的な方法 ```javascript var MyClass = function(){ var privateProp = 1; this.publicProp = 2; var me = this; var privateMethod = function(){ console.group('private method called'); console.log('private = ' + privateProp); console.log('public = ' + me.publicProp); console.log('static = ' + MyClass.staticProp); console.groupEnd(); }; this.privilegedMethod = function(){ console.group('privileged method called'); console.log('private = ' + privateProp); console.log('public = ' + this.publicProp); console.log('static = ' + MyClass.staticProp); console.groupEnd(); }; privateMethod(); }; MyClass.staticProp = 11; MyClass.staticMethod = function(){ console.group('static method called'); console.log('private = ' + this.privateProp); console.log('public = ' + this.publicProp); console.log('static = ' + MyClass.staticProp); console.groupEnd(); }; MyClass.prototype.publicMethod = function(){ console.group('public method called'); console.log('private = ' + this.privateProp); // undefined console.log('public = ' + this.publicProp); // undefined console.log('static = ' + MyClass.staticProp); console.groupEnd(); }; var c = new MyClass(); console.group('property access test'); console.log('private = ' + c.privateProp); // undefined console.log('public = ' + c.publicProp); console.log('static = ' + MyClass.staticProp); console.groupEnd(); console.group('method access test'); //c.privateMethod(); // Uncaught TypeError: undefined is not a function c.privilegedMethod(); c.publicMethod(); MyClass.staticMethod(); console.groupEnd(); ``` 比較的クラスっぽい挙動になる * `const(or final)` が表現できない * `static` の private or public の表現ができない * プライベートプロパティのアクセスにpublidではなくprivileged?とかいう変なメソッドをcallしないといけない * 上記の理由でpublicメソッドを使いづらい * じゃあpublicをprivilegedで置き換えればいいじゃん * でも `var MyClass = function(){...}` の部分はインスタンス生成の度に複製されるので、メモリ的にいまいち ##Google JavaScript Style Google JavaScript Style で書き直してみる ```javascript /** * @constructor */ var MyClass = function() { this.privateMethod_(); }; /** @public */ MyClass.staticProp = 11; /** @public */ MyClass.staticMethod = function() { console.group('static method called'); //console.log('private = ' + this.privateProp_); //console.log('public = ' + this.publicProp); console.log('static = ' + MyClass.staticProp); console.groupEnd(); }; /** @private */ MyClass.prototype.privateProp_ = 1; /** @public */ MyClass.prototype.publicProp = 2; /** @private */ MyClass.prototype.privateMethod_ = function() { console.group('private method called'); console.log('private = ' + this.privateProp_); console.log('public = ' + this.publicProp); console.log('static = ' + MyClass.staticProp); console.groupEnd(); }; /** @public */ MyClass.prototype.publicMethod = function() { console.group('public method called'); console.log('private = ' + this.privateProp_); console.log('public = ' + this.publicProp); console.log('static = ' + MyClass.staticProp); console.groupEnd(); }; var c = new MyClass(); console.group('property access test'); //console.log('private = ' + c.privateProp_); console.log('public = ' + c.publicProp); console.log('static = ' + MyClass.staticProp); console.groupEnd(); console.group('method access test'); //c.privateMethod_(); c.publicMethod(); MyClass.staticMethod(); console.groupEnd(); ``` 一般的な方法よりはきれいにみえる * 基本的にアノテーションでスコープを表現する * const は @const で表現する * private, public は @private, @public で表現する * @private なものには 最後に `_` をつける * @private な変数、メソッドにも普通にアクセスできてしまう(書き方自体はpublicと変わらない為 あくまでもルールなので、無視しようとすればできてしまうが、 Closure Linterでチェックをするとアノテーションに基づいてちゃんと警告を出してくれる
No comments:
Post a Comment
Newer Post
Older Post
Home
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment