今回は、JSで継承を実装する方法と、JSで継承を実装する際の注意事項について説明します。以下は実際的なケースです。
私たちは皆、オブジェクト指向の 3 つの主要な特徴がカプセル化、継承、ポリモーフィズムであることを知っています。 カプセル化は、プロパティとメソッドをプライベート化することに他なりません。そのため、JS でプライベート プロパティとプライベート メソッドを提供します。 JS にはポリモーフィズムがないため、JS はオブジェクト指向言語ではなく、オブジェクトベース言語であると言われます。 つまり、オブジェクト指向の 3 つの大きな特徴のうち、JS で最も重要なのは継承です。
サブクラスを使用して別の親クラスを継承すると、サブクラスは親クラスのプロパティとメソッドを自動的に持つことができます。 >>>2 つの継承当事者は 2 つのクラス間で発生します。 したがって、いわゆる継承とは、親クラスのすべての属性とメソッドをサブクラスに持たせることに他なりません。したがって、JS ではこのステップをシミュレートする必要があり、それを実現するには 3 つの一般的な方法があります。 それは、Object のプロトタイプを拡張して継承を実装すること、call と apply を使用して継承を実装すること、およびプロトタイプを使用して継承を実装することです。2. オブジェクトのプロトタイプを拡張して継承を実装します
継承を実現するために Object を拡張する本質は、トラバーサル ループを通じて親クラスのすべてのプロパティとメソッドを 1 つずつサブクラスにコピーするメソッドを自分で記述することです。 詳細な手順は次のとおりです: 1: 親クラスを定義しますfunctionParent(){}
funtion Son(){}
Object オブジェクト に拡張メソッドを追加します。 りー
4: サブクラスオブジェクトが拡張メソッドを呼び出すSon.customExtend(Parent);
3. 呼び出しと適用を使用して継承を実装します
まず、このメソッドを使用して継承を表示するために、呼び出しの関数と適用関数を確認しましょう: call と apply: 関数名を使用してメソッドを呼び出し、関数内のこれがオブジェクトを指すように強制します 呼び出し書き込みメソッド: func.call (func、パラメータ 1、パラメータ 2... の this が指すオブジェクト); applyの書き方: func.apply(func, [パラメータ1, パラメータ2...]のthisが指すobj); そこで、この2つの関数を使って継承を実装するアイデアは、サブクラス内で親クラスの関数を使ってcallまたはapplyを呼び出し、親クラスのthisをサブクラスのthisに強制的にバインドするというものです。 この場合、親クラスの this にバインドされている属性とメソッドは、サブクラスの this に正常にバインドされるのではないでしょうか?詳細な手順は次のとおりです:
1: 親クラスを定義しますfuntion Parent(){}
functionSon(){}
りー
4. プロトタイプを使用して継承を実装します
プロトタイプを使用して継承を実装するのは、サブクラスのプロトタイプを親クラスのオブジェクトに指定するだけで、比較的単純で理解しやすいです。 詳細な手順は次のとおりです: 1: 親クラスを定義しますfunctionParent(){}
functionSon(){}
Son.prototype =newParent();
5. 閉鎖
クロージャを理解するには、まず JS のスコープを理解する必要があります: 1. JSのスコープ グローバル変数: 関数の外で宣言された変数局部变量:函数内声明的变量
在JS中,函数为唯一的局部作用域,而if、for等其他{}没有自己的作用域
所以,函数外不能访问局部变量。其实,变量在函数执行完毕以后,占用的内存就会被释放。
2、闭包
在概述中,我刚刚提到,面向对象的三大特征中的“封装”,我们可以用函数的私有属性来实现。这个私有属性,其实也就是局部变量。
但是我们都知道,封装是限制外部的访问,并不是直接拒绝外部的访问,那么我们在函数中私有的属性,怎么才能在外部访问呢?答案就是闭包!
JS中,提供了一种"闭包"的概念:在函数内部,定义一个子函数,可以用子函数访问父函数的私有变量。执行完操作以后,将子函数通过return返回。
代码示例:
functionfunc2(){varnum = 1;functionfunc3(){varsum = num+10; alert(sum); }returnfunc3; }varf =func2(); f();
3、闭包的作用:
① 访问函数的私有变量;
② 让函数的变量始终存在于内存中,而不被释放。
4、闭包的典型应用
我们来做这样一个功能:页面中有6个li,要求实现点击每个li,弹出这个li对应的序号。
HTML代码很简单:
那JS代码呢?我觉得很大一部分同学会这样写:
varlis = document.getElementsByTagName("li");for(vari=0;i lis[i].onclick=function(){ alert("您/点击了第"+i+"个li!"); }
那么,这样对吗?不对!!!我们来分析一下:页面加载的时候,JS代码会全部执行,也就是上面的for循环在页面加载完就已经执行完了!那,这个i就已经变成了lis.length。也就是说,你在点击li的时候,无论点击第几个,弹出的都是lis.length。
那么,我们应该怎么修改呢?看代码!
varlis = document.getElementsByTagName("li");for(vari=0;i lis[j].onclick=function(){ alert("您/点击了第"+j+"个li!"); } }(); }
区别在哪?明眼人一眼就看穿我们在for循环外面嵌套了一层自执行函数!这种函数套函数的形式,就形成了闭包!
那作用呢?我们刚才强调,闭包的自执行函数会有自己的作用域。在函数里面的代码没有执行的时候,自执行函数中的j是不会被释放掉的!
也就是说,循环转了6次!生成了6个独立的函数空间,每个空间中有自己独立的j变量,所以最终不会出现所有li点击都是lis.length的情况!
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上がJSで継承を実装する方法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。