ホームページ ウェブフロントエンド jsチュートリアル JavaScript「jquery継承」の使い方で知っておきたいこと(詳細コード解説)

JavaScript「jquery継承」の使い方で知っておきたいこと(詳細コード解説)

Aug 19, 2021 am 11:49 AM
html jquery js php

前回の記事「JSの配列reduceメソッドを徹底分析(コード付き)」では、JSの配列reduceメソッドについて理解していただきました。次の記事では、JS 継承で jQuery を使用する方法を説明します。友人はそれを参照してください。

JavaScript「jquery継承」の使い方で知っておきたいこと(詳細コード解説)

jquery現時点ではバージョン 3.3.1 です。現在、さまざまなブラウザの普及により、フロントエンド フレームワークはjquery は世界で唯一のものです。私はコードを書くときにのみ jquery を使用します。コードを拾って実行するだけの輝かしい時代は終わりました。

2006 年に jQuery の最初のバージョンがリリースされ、その簡潔かつ柔軟なプログラミング スタイルが開発者に愛されました。これ自体は JavaScript フレームワークであり、その設計目的は「write Less, Do More」です。つまり、コードの記述を減らし、より多くのことを実行することを推奨しています。いろいろ。一般的に使用される JavaScript 関数コードをカプセル化し、シンプルな JavaScript 設計パターンを提供し、HTML ドキュメント操作、イベント処理、アニメーション設計、および Ajax# を最適化します。 ##交流。

以前に人気があり、現在は廃止されるまで、多くのフロントエンド エンジニアは、

jQuery について、多数の操作 DOM が便利ではあるものの、今後もそう言いました。ページのパフォーマンスが大幅に犠牲になります。一方、現段階では、ReactVueAngularjs などの主流のフロントエンド フレームワークは jQuery に依存していません。独立して使用できます。さらに、ブラウザの互換性の問題はますます少なくなり、ブラウザの互換性が問題でなくなると、jQuery の価値は大幅に低下します。

Microsoft が

github を買収してから 52 日目、 github 変更も放棄されました jquery、奇妙な代替案はネイティブ js を使用します:

  • は ## を使用します# querySelectorAll

    DOM ノードをクエリします;

  • ajax

    の代わりに fetch を使用します;

  • イベント処理ではイベント プロキシを使用します;
  • DOM

    標準化を使用して polyfill;## を作成します

    #カスタム要素が使用されます。

使用していなくても学習できますJavaScript「jquery継承」の使い方で知っておきたいこと(詳細コード解説)

この記事は大まかな実装です

jquery

ready, each, binding, ``$.fn.extend, $.extendInitialization

$

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>(function (win) { var _$ = function (selector, context) { /** * 通常咱们定义一个 函数 var Fun = function(){} * 然后定义一个 Fun.prototype.init = function(){} * 那么咱们调用init 的时候 得先要实例化对象 var f = new Fun() * 然后f.init() * 这里就省去了 var $ = new $() */ return new _$.prototype.Init(selector, context); }; _$.prototype = { //初始化$ Init: function (selector, context) { this.elements = []; /** * 传入的类型是function 就执行ready事件,如果是document 就将document对象插入到this.elements * 主要就是判断$(document).ready 和 $(function(){}) 这两种的ready事件的写法 */ if (typeof selector === &quot;function&quot;) { this.elements.push(document); this.ready(selector); } else { var context = context || document; var isDocument = (ele) =&gt; Object.prototype.toString.call(ele) == &quot;[object HTMLDocument]&quot; || &quot;[object Document]&quot;; if (isDocument(selector)) { this.elements.push(selector); } else { /** * 如果是字符串的话就查询该节点 $(&amp;#39;.class&amp;#39;) | $(&amp;#39;#id&amp;#39;) */ if (context.querySelectorAll) { var arr = context.querySelectorAll(selector); for (var i = 0; i &lt; arr.length; i++) { this.elements.push(arr[i]); } } } } }, //实现each each: function (callback) {}, //实现ready ready: function (callback) {}, //实现bind bind: function (type, callback) {}, }; /** * 让两个作用域不一样的对象共享一个方法,让他们的原型指向一致,即Init.prototype = _$.prototype * 那么原型一致之后 就可以共享this.elements 属性了。 */ _$.prototype.Init.prototype = _$.prototype; window.$ = _$; })(window || global);</pre><div class="contentsignin">ログイン後にコピー</div></div> 準備完了

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>//实现ready ready: function (callback) { var isDocument = (ele) =&gt; Object.prototype.toString.call(ele) == &amp;#39;[object HTMLDocument]&amp;#39; || &amp;#39;[object Document]&amp;#39; //如果已经取得了节点 if (isDocument(this.elements[0])) { if (document.addEventListener) { //判断火狐、谷歌 /** * DOM树构建完成的时候就会执行DOMContentLoaded * 页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了,才会触发window.onload * 这也就是$(document).ready() 比 window.onload 执行早的原因 * * arguments.callee 博客里面有一篇文章 [js-递归] 里面专门讲到了,这里不再解释了 */ document.addEventListener(&amp;#39;DOMContentLoaded&amp;#39;, function () { document.removeEventListener(&amp;#39;DOMContentLoaded&amp;#39;, arguments.callee, false) callback() }, false) } else if (document.attachEvent) { //判断IE document.attachEvent(&amp;#39;onreadystatechange&amp;#39;, function () { if (document.readyState == &amp;#39;complete&amp;#39;) { document.detachEvent(&amp;#39;onreadystatechange&amp;#39;, arguments.callee); callback() } }) } else if (document.lastChild == document.body) { //body已经加载完了,就直接回调了 callback() } } },</pre><div class="contentsignin">ログイン後にコピー</div></div>

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>//实现each each: function (callback) { if (this.elements.length &gt; 0) { for (var i = 0; i &lt; this.elements.length; i++) { callback.call(this, this.elements[i], i); } } },</pre><div class="contentsignin">ログイン後にコピー</div></div>
バインド

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>//实现bind bind: function (type, callback) { if (document.addEventListener) { //判断火狐、谷歌 this.each(function (item, i) { item.addEventListener(type, callback, false) }) } else if (document.attachEvent) { //判断IE this.each(function (item, i) { item.attachEvent(&amp;#39;on&amp;#39; + type, callback) }) } else { this.each(function (item, i) { //其他浏览器 egg: item.onclick = function(){} item[&amp;#39;on&amp;#39; + type] = callback }) } }</pre><div class="contentsignin">ログイン後にコピー</div></div>
$.fn.extend/$.extend

$.fn.extend

は、クエリ ノード オブジェクトの拡張メソッドであり、以下に基づいています。

# プロトタイプの拡張メソッド $.extend

は拡張通常メソッドであり、$

の静的メソッドです。公式の説明は次のとおりです。 :

jQuery.extend()

: 2 つ以上のオブジェクトの内容を最初のオブジェクトに結合します (2 つ以上のオブジェクトを最初のオブジェクトに結合します)

jQuery.fn.extend()

:オブジェクトのコンテンツを jQuery プロトタイプにマージして、新しい jQuery インスタンス メソッドを提供します (オブジェクトを

jQueryprototype にマウントします) Attribute、新しい jQuery インスタンス メソッドを拡張します) $.fn.extend

このメソッドの本来の目的は、

を使用できることです。 $( "").newMetod()この方法でアクセスすると、実際には extend メソッドが $ プロトタイプに追加されます。真ん中の fn は実際には名前空間の役割に似ており、実質的な意味はありません。 $.extend$.fn.extend

; (function (win) {
  ...
  _$.prototype.Init.prototype = _$.prototype;

   _$.fn = _$.prototype; //把对象挂载到jQuery的prototype属性

  var isObj = (o) => Object.prototype.toString().call(o) === &#39;[object Object]&#39;;
  $.fn.extend = function (obj) {
    if (isObj(obj)) {
      for (var i in obj) {
        this[i] = obj  //注意这里的this指向是 $.prototype
      }
    }
  }
ログイン後にコピー
$.extend

var isObj = (o) => Object.prototype.toString().call(o) === &#39;[object Object]&#39;;
...
_$.extend = function (obj) {
    if (isObj(obj)) {
        for (var i in obj) {
            this[i] = obj[i]; //注意这里的this指向是 $
        }
    }
}
ログイン後にコピー
と区別するためこれら 2 つはまったく同じに見えますが、違いはありません。コメントで述べたように、this

は異なる点を指しています。例を見てみましょう:

<!DOCTYPE html>
<html>
  <head>
    <title>jQuery.extend()与jQuery.fn.extend()区别</title>
    <meta charset="utf-8" />
    <script type="text/javascript" src="jquery.js"></script>
    <!-- 开始扩展 -->
    <script type="text/javascript">
      (function ($) {
        $.extend({
          sayHello: function () {
            console.log("Hello");
          },
        });
        $.fn.extend({
          sayHello: function () {
            console.log("Hello");
          },
        });
      })(jQuery);
    </script>
    <!-- 调用 -->
    <script type="text/javascript">
      $(document).ready(function () {
        //$.extend扩展调用
        $.sayHello();

        //$.fn.extend扩展调用
        $("#test").sayHello();
      });
    </script>
  </head>
  <body>
    <div id="test"></div>
  </body>
</html>
ログイン後にコピー
これで明らかです。 jQuery.extend(object);

jQuery クラス自体を拡張するには、そのクラス自体に新しいメソッドを追加します。 $.xxx()jQuery.fn.extend(object);

メソッドを

jQuery オブジェクトに追加します$('# test').xxx()$.extend

一般的な使用法

#

//在jquery全局对象中扩展一个net命名空间。
$.extend({ net: {} });

//方法扩展到之前扩展的Jquery的net命名空间中去。
$.extend($.net, {
  sayHello: function () {
    console.log("Hello");
  },
});

//extend方法还有一个重载原型
//extend(boolean,dest,src1,src2,src3...),第一个参数boolean代表是否进行深度拷贝
var a = { protocol: "http", hash: { a: 1, b: 2 } };
var b = { host: "chuchur.com", hash: { b: 1, c: 2 } };

var result = $.extend(true, {}, a, b);
console.log(result); //{ protocol: &#39;http&#39;,host: &#39;chuchur.com&#39;, hash: { a: 1, b: 1,c:2 } }

var result = $.extend(false, {}, a, b);
console.log(result); //{ protocol: &#39;http&#39;,host: &#39;chuchur.com&#39;, hash: { b: 1, c:2 } }
ログイン後にコピー
#完全なコード # <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>(function (win) { var _$ = function (selector, context) { /** * 通常咱们定义一个 函数 var Fun = function(){} * 然后定义一个 Fun.prototype.init = function(){} * 那么咱们调用init 的时候 得先要实例化对象 var f = new Fun() * 然后f.init() * 这里就省去了 var $ = new $() */ return new _$.prototype.Init(selector, context); }; _$.prototype = { //初始化$ Init: function (selector, context) { this.elements = []; /** * 传入的类型是function 就执行ready事件,如果是document 就将document对象插入到this.elements * 主要就是判断$(document).ready 和 $(function(){}) 这两种的ready事件的写法 */ if (typeof selector === &quot;function&quot;) { this.elements.push(document); this.ready(selector); } else { var context = context || document; var isDocument = (ele) =&gt; Object.prototype.toString.call(ele) == &quot;[object HTMLDocument]&quot; || &quot;[object Document]&quot;; if (isDocument(selector)) { this.elements.push(selector); } else { /** * 如果是字符串的话就查询该节点 $(&amp;#39;.class&amp;#39;) | $(&amp;#39;#id&amp;#39;) */ if (context.querySelectorAll) { var arr = context.querySelectorAll(selector); for (var i = 0; i &lt; arr.length; i++) { this.elements.push(arr[i]); } } } } }, //实现each each: function (callback) { if (this.elements.length &gt; 0) { for (var i = 0; i &lt; this.elements.length; i++) { callback.call(this, this.elements[i], i); } } }, //实现ready ready: function (callback) { var isDocument = (ele) =&gt; Object.prototype.toString.call(ele) == &quot;[object HTMLDocument]&quot; || &quot;[object Document]&quot;; //如果已经取得了节点 if (isDocument(this.elements[0])) { if (document.addEventListener) { //判断火狐、谷歌 /** * DOM树构建完成的时候就会执行DOMContentLoaded * 页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了,才会触发window.onload * 这也就是$(document).ready() 比 window.onload 执行早的原因 * * arguments.callee 博客里面有一篇文章 js-递归里面专门讲到了,这里不再解释了 */ document.addEventListener( &quot;DOMContentLoaded&quot;, function () { document.removeEventListener( &quot;DOMContentLoaded&quot;, arguments.callee, false ); callback(); }, false ); } else if (document.attachEvent) { //判断IE document.attachEvent(&quot;onreadystatechange&quot;, function () { if (document.readyState == &quot;complete&quot;) { document.detachEvent(&quot;onreadystatechange&quot;, arguments.callee); callback(); } }); } else if (document.lastChild == document.body) { //body已经加载完了,就直接回调了 callback(); } } }, //实现bind bind: function (type, callback) { if (document.addEventListener) { //判断火狐、谷歌 this.each(function (item, i) { item.addEventListener(type, callback, false); }); } else if (document.attachEvent) { //判断IE this.each(function (item, i) { item.attachEvent(&quot;on&quot; + type, callback); }); } else { this.each(function (item, i) { //其他浏览器 egg: item.onclick = function(){} item[&quot;on&quot; + type] = callback; }); } }, }; /** * 让两个作用于不一样的对象共享一个方法,让他们的原型指向一直,即Init.prototype = _$.prototype * 那么指向之后 就可以共享this.elements 属性了。 */ _$.prototype.Init.prototype = _$.prototype; var isObj = (o) =&gt; Object.prototype.toString().call(o) === &quot;[object Object]&quot;; $.fn.extend = function (obj) { if (isObj(obj)) { for (var i in obj) { this[i] = obj; //注意这里的this指向是 $.prototype } } //....这里是简写 }; _$.extend = function (obj) { if (isObj(obj)) { for (var i in obj) { this[i] = obj[i]; //注意这里的this指向是 $ } } //....这里是简写 }; window.$ = _$; })(window || global);</pre><div class="contentsignin">ログイン後にコピー</div></div>【終了】

推奨学習:

jQuery ビデオ チュートリアル

以上がJavaScript「jquery継承」の使い方で知っておきたいこと(詳細コード解説)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles