JavaScriptのクロージャと実装クラスの継承(ES6用以外)

まず、我々はすべての関数定義は、このjsファイルであることを知っています

function func(){ //声明一个普通的函数 //省略代码 } 

名前のない関数は限り、無名関数を呼び出し

function(){ //声明一个匿名函数,一般这样声明方式是用于回调函数 //省略代码 } 

それとも、私たちは、それ自体の機能として、この変数を匿名関数を保持する変数を使用するために使用されます

var func = function(){ //匿名函数保存到func变量内 //省略代码 } 

また、関数を呼び出すときに、関数名や変数名は括弧が続いて、次のような

func(); //调用函数 

さらに、関数を宣言するとき、あなたはまた、直接呼び出すことができ、機能の即時実行と呼ばれる、我々はこのように、2つのブラケットを追加する必要があります

(function(){ //即时执行函数 //省略代码 })(); 

それは、リアルタイムの機能が戻るに値を実行することであればもちろん、関数は、値を返すことができ、その後、効果が起こるのだろうか?

var func = (function(){ //即时执行函数 var i = 1; return i; })(); 

書き込み、funcは無名関数だけでなく取得しますが、関数の戻り結果、FUNC = 1

私は------行を分割しています---------------------------------------- -----------------------------------

ただ、私たちの関数は整数を返しますが、我々は機能を返す場合は、別の機能がありますか?それはこのように、閉鎖となりました:

var func = (function(){ //即时执行函数 var resultFunc = function(){ //要返回的函数 //省略代码 } return resultFunc; })(); 

より多くの書き込みよりも関数funcは、だから何の使用それは、resultFuncのですか?変数iの範囲という次のコード、メモを参照してください。

var func = (function(){ var i = 5; //声明了局部变量 var resultFunc = function(){ console.log(i); //返回的函数体内能访问变量 i //省略代码 } //作用域内能访问变量 i return resultFunc; })(); //函数体外能不能访问变量 i 

I外部変数、このような宣言は、オブジェクト指向のプライベートメンバ変数のように、アクセスされていないではないのですか?次に、我々は内部の方法を試してみてください

var func = (function(){ var i = 5; var privateFunc = function(){ //声明了局部变量 //省略代码 } var resultFunc = function(){ privateFunc(); //调用局部函数 //省略代码 } return resultFunc; })(); 

概要:実際、私たちは書いてみることができます。

var func = (function(){ var i = 5; var privateFunc = function(){ //声明了局部变量 console.log("执行了privateFunc局部函数"); } var resultFunc = function(j){ console.log("外部变量:"+j); console.log("内部变量:"+i); privateFunc(); //调用局部函数 //省略代码 } return resultFunc; })(); var test = new func(9); 
 
結果

このビューは、実際にはより多くの私たちの新しいFUNC()必要なときでコンストラクタ関数のようなresultFuncと一度だけ実行され、この関数はああ、外部パラメータを受け入れることができます。

私は------行を分割しています---------------------------------------- -----------------------------------

まあ、我々は途中でいくつかのパブリック関数のプロトタイプを追加することができ、これらの機能は、アクセス可能なローカル変数とローカル関数です。

var func = (function(){ var i = 5; var privateFunc = function(){ //声明了局部变量 console.log("执行了privateFunc局部函数"); } var resultFunc = function(j){ console.log("外部变量:"+j); console.log("内部变量:"+i); privateFunc(); //调用局部函数 //省略代码 } var _proto = resultFunc.prototype; //取出prototype变量 _proto.myName = "ken"; //prototype的变量 _proto.publicFunc = function(){ //prototype的方法 console.log("这个是公共的方法,还有我的名字是"+this.myName); } return resultFunc; })(); var test = new func(9); test.publicFunc(); console.log(test.myName); 
 
業績

外部を通じて。「」これによって、独自の変数にアクセスするコンテンツ、プロトタイプ関数本体のプロトタイプを呼び出します。..
このように、パブリックとプライベートメソッドのメンバーは、閉鎖を介してそれらを達成するために。

---------------------------------------- -------再びラインを割ます----------------------------------

シミュレート・オブジェクト指向の継承にしたい場合は、上記を通じて、パブリック変数やメソッドは、親クラスのコードを整理するために、限り、それのプロトタイプのコピーとして、実際には、プロトタイプに格納されています。

var Super = (function(){ function _super(){ console.log("Super constructor"); this.name = "Super"; } var _proto = _super.prototype; _proto.sayHi = function(){ console.log("hello ! my name is "+this.getMyName()); } _proto.getMyName = function(){ return this.name; } return _super; })(); var s = new Super(); s.sayHi(); 
 
ときに新しい親結果

以下は、サブクラスの継承であります

var child = (function(){ var extend = Super; //定义要继承的父类 function _child(){ //子类的构造函数 extend.call(this); //让父类内部的this替换成子类的this,执行函数 console.log("child constructor"); this.name="child"; //覆盖子类的name } var nullObj = function(){}; //这里建立一个空白对象 nullObj.prototype = extend.prototype; //空白对象的prototype指向父类的prototype _child.prototype = new nullObj(); //新建nullObj(实际上是复制一份)的prototype给_child _child.prototype.constructor = _child;//把_child的构造函数放回prototype里,因prototype刚刚已经被覆盖了 var _proto = _child.prototype; //取得prototype ///这里可以继续添加子类的方法 return _child; })(); 

注:nullObj.prototype = extend.prototype; nullObj.prototypeは直接nullObj.prototypeの内容を変更することはできません、または唯一の新しいnullObjによって_child.prototypeにコピーすることができ、親クラスのコードに影響を与えるだろう、ここに引用されています

テストコール

var c = new child(); c.sayHi(); console.log(c.name); 
 
業績

ここでは、最初に見た親クラスのコンストラクタを呼び出すことで、その後、その後、sayHiメソッドは、サブクラスによって継承サブクラスのコンストラクタを呼び出すと、子サブクラスの文字列に内容に名前を付けることができます。

メソッドは、クラスES6と同じではありませんクロージャの使用は何ですか?
クラスの●ES6民間メンバーは、この変数や関数、外部貫通内部アクセスが存在しません。「」アクセスを。
●閉鎖モードはプライベートメンバを持つことができ、アクセスES6と公共のメンバー同様、理由スコープのプライベートメンバへのアクセス限り、ダイレクトコール十分。
●閉鎖モードを使用するよりも簡単ES6は、自分の用途に応じて選択することができます。




リンクします。https://www.jianshu.com/p/77e5840fc514

おすすめ

転載: www.cnblogs.com/porter/p/12152455.html