上品な書き出しタイプ
4420 ワード
前言
今はES 6の時代ですが、ES 5はどのように書かれていますか?本文はJavaScriptが対象に向かってプログラミングする中の類の書き方を詳述して、そして段階に分けてどのように優雅な種類を書き出しますかを述べます.
一、例
例としては、軽く提示されたコンポーネント が表示されます.
JavaScriptのクラスは
クラスは2つの部分に分けられます.
2.1コンストラクタ
コンストラクタは直感的に理解すると、関数の内部に書かれたコードです.Toastの例から見て、コンストラクタは以下の部分です.
2.2原型
プロトタイプ上の方法および変数の宣言は、いずれも
2.3コンストラクタと原型の違い
プロトタイプ上の方法と変数は、このクラスのすべてのインスタンスオブジェクトが共有されます.つまり、一つだけです.コンストラクタ内のコードブロックは、各インスタンスオブジェクトが単独で占有されます.
三、コード規範類の命名規範には、業界では成文しない規定があり、頭文字が大文字である. プロトタイプ上のプライベートメソッドは、デフォルトではアンダースコアで開始されます.このようなのはチームの協力の面でreviewコードのメリットがあるだけで、実際には暴露される方法です. 四、実用化はnewと関係がない
クラスの実装は、newオペレータを使用する必要があります強制的に要求されます.newオペレータを使用しないと、コンストラクタ内のthisが、現在の実用化対象ではないことになります.最適化の方式は、
今はES 6の時代ですが、ES 5はどのように書かれていますか?本文はJavaScriptが対象に向かってプログラミングする中の類の書き方を詳述して、そして段階に分けてどのように優雅な種類を書き出しますかを述べます.
一、例
例としては、軽く提示されたコンポーネント
Toast
が挙げられる.実現が必要な機能:on
メソッドには、ヒントoff
方法、隠しヒントinit
方法、初期化提示語function Toast(option){
this.prompt = '';
this.elem = null;
this.init(option);
}
Toast.prototype = {
//
constructor: Toast,
//
init: function(option){
this.prompt = option.prompt || '';
this.render();
this.bindEvent();
},
//
show: function(){
this.changeStyle(this.elem, 'display', 'block');
},
//
hide: function(){
this.changeStyle(this.elem, 'display', 'none');
},
// dom
render: function(){
var html = '';
this.elem = document.createElement('div');
this.changeStyle(this.elem, 'display', 'none');
html += 'x'
html += ''+ this.prompt +'
';
this.elem.innerHTML = html;
return document.body.appendChild(this.elem);
},
//
bindEvent: function(){
var self = this;
this.addEvent(this.elem, 'click', function(e){
if(e.target.className.indexOf('J-close') != -1){
console.log('close Toast!');
self.hide();
}
});
},
//
addEvent: function(node, name, fn){
var self = this;
node.addEventListener(name, function(){
fn.apply(self, Array.prototype.slice.call(arguments));
}, false);
},
//
changeStyle: function(node, key, value){
node.style[key] = value;
}
};
var T = new Toast({prompt:'I\'m Toast!'});
T.show();
二、類の構成JavaScriptのクラスは
で実現されます.クラスの例示的な形式は以下の通りである.var T = new Toast();
その中のポイントはFunction
の編纂です.クラスは2つの部分に分けられます.
constructor
+prototype
.つまり
+
です.2.1コンストラクタ
コンストラクタは直感的に理解すると、関数の内部に書かれたコードです.Toastの例から見て、コンストラクタは以下の部分です.
function Toast(option){
this.prompt = '';
this.elem = null;
this.init(option);
}
ここのthis
は、例示的なクラスを指す.new Toast()
によって実装される度に、コンストラクタは一回実行されます.2.2原型
プロトタイプ上の方法および変数の宣言は、いずれも
Toast.prototype.*
を介して行われる.原型上の普通の書き方は以下の通りです.Toast.prototype.hide = function(){/*code*/}
Toast.prototype.myValue = 1;
しかし、この書き方が悪いところは、毎回前半のToast.prorotype
を書いてしまうので、ちょっと面倒です.コード圧縮最適化の面でも友好的ではなく、最適な圧縮ができません.改善の方法は以下の通りです.Toast.prorotype = {
constructor: Toast,
hide: function(){/*code*/},
myValue: 1
}
ここでの最適化は、プロトタイプを新しい空のオブジェクト{}
に向けることである.メリットとしては、{key:value}
でプロトタイプ上の方法と変数を書くことができます.しかし、このような方法はプロトタイプ上のコンストラクタprototype.constructor
の指向を変える.再明示的なステートメントconstructor
の指向がない場合、Toast.constructor.prototype.constructor
の暗黙的な形はObject
に向けられている.正しい方向はToast
であるべきです.new
によって実装されていますが、クラス継承においてconstructor
の指向異常は、正しくない継承判断結果をもたらします.これは私たちが見たくないものです.したがって、constructor
を修正する必要があります.2.3コンストラクタと原型の違い
プロトタイプ上の方法と変数は、このクラスのすべてのインスタンスオブジェクトが共有されます.つまり、一つだけです.コンストラクタ内のコードブロックは、各インスタンスオブジェクトが単独で占有されます.
this.**
方式を使っても、プライベート変数の方式を使っても、すべて独占的です.したがって、クラスを書くときは、その属性が共有されているか、それとも独占されているかを考慮する必要があります.これをもって、コンストラクタまたは原型について声明することにします.三、コード規範
クラスの実装は、newオペレータを使用する必要があります強制的に要求されます.newオペレータを使用しないと、コンストラクタ内のthisが、現在の実用化対象ではないことになります.最適化の方式は、
instanceof
を使って保護を行うことです.function Toast(option){
if(!(this instanceof Toast)){
return new Toast(option);
}
this.prompt = '';
this.elem = null;
this.init(option);
}
上记のコードから、この技术を使うと、チームの一部のプリクラエビの使用ミスを防止できます.この忍者の技术はかっこいいですが、一方では、利用者が正しい方法で実用化してほしいです.ですから、次のような防護方法に変えます.function Toast(option){
if(!(this instanceof Toast)){
throw new Error('Toast instantiation error');
}
this.prompt = '';
this.elem = null;
this.init(option);
}
このように鍋を投げ返すのがもっといいでしょう.