ホームページ  >  記事  >  ウェブフロントエンド  >  jqueryでnewを使わずにビルドする方法

jqueryでnewを使わずにビルドする方法

亚连
亚连オリジナル
2018-06-22 13:58:511022ブラウズ

ほとんどの人が jQuery を使用するとき、new を使用せず、$('') を直接使用して構築する最初の構築方法を使用します。これは、jQuery にとって非常に便利な場所でもあります。この記事では主に、新たな構築を必要としない jquery の学習ノートに関する関連情報を紹介します。必要な方は以下をご覧ください。

はじめに

オブジェクトを作成する場合、論理的に言えば、jquery もオブジェクトであり、new jquery() 構築 <code>new jquery() を使用して jquery オブジェクトを作成せず、$(ele) に似たメソッドを直接使用して jquery オブジェクトを作成するのはなぜですか?実際、new は依然として内部でビルドに使用されていますが、jquery が内部でビルドします。以下のコードを参照してください new jquery()来构建呀为什么我们创建jquery对象不用new jquery()而是直接使用类似$(ele)的方式去构建出来一个jquery对象呢?其实内部还是使用了new来构建的,只是jquery内部帮我们构建了而已,请看下面代码

function Jquery(selector, context) {
  return new Jquery(selector, context);
 }

 Jquery.prototype = {
  version:&#39;1.01&#39;
 }

直接这样内部使用new来构建Jquery,很明显是有问题的,这样的话就形成了死循环。为了解决死循环的问题,请看下面代码:

function Jquery(selector, context) {
 return Jquery.prototype.init(selector, context);
}

Jquery.prototype = {
 version:&#39;1.01&#39;,
 init: function () {
  this.name = "lin";
  return this;
 }
}

var a = Jquery();
var b = Jquery();
console.log(a.version); //1.01
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na

死循环的问题确实解决了,但是又发现了新的问题,可以看到a和b两个对象的属性是公用的,我修改a.name属性为na,b.name属性也跟着变为了na,其原因就是this都是指向Jquery的

为了解决这个问题,我们可以每次调用Jquery()的时候都构建一个新的对象,改进代码如下:

function Jquery(selector, context) {
 return new Jquery.prototype.init(selector, context); //注意看,这里多了个new
}

Jquery.prototype = {
 version:&#39;1.01&#39;,
 init: function () {
  this.name = "lin";
  console.log(this);
  return this;
 }
}

var a = Jquery();
var b = Jquery();
console.log(a.version); //undefined
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na

这样处理之后,属性共享的问题已经解决了,每个对象都有各自的属性,可以自由修改,每个对象互不影响,但是又又又发现了新的问题,可以看到我们控制台打印a.version这个属性的时候是读取不到这个属性的,原因就在于此时Jquery.prototypeJquery.prototype.init.prototype是互不相干的,我们创建的是Jquery.prototype.init对象,所以只能读到Jquery.prototype.init.prototype上的属性而读取不到Jquery.prototype上的属性的(该例指version这个属性),解决办法很简单,就是把Jquery.prototype赋值给Jquery.prototype.init.prototype,这样就相当于把Jquery原型上的属性全部赋值到了Jquery.init的原型上,请看下面代码:

function Jquery(selector, context) {
 return new Jquery.prototype.init(selector, context);
}

Jquery.prototype = {
 version:&#39;1.01&#39;,
 init: function () {
  this.name = "lin";
  return this;
 }
}

Jquery.prototype.init.prototype = Jquery.prototype; //画龙点睛之笔

var a = Jquery();
var b = Jquery();
console.log(a.version); //1.01
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na

可以看到,我们控制台打印a对象的version属性,已经可以读取并且打印出来了。

至此,已经完成了Jquery的无new构建。

ps:jQuery.fn其实就是jQuery的prototype,jquery源码可以看到该条语句:jQuery.fn = jQuery.prototype = {};

  $()和jquery()其实是一样的,jquery源码可以看到该条语句: window.jQuery = window.$ = jQuery;

function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.getInfo = function(){
console.log(this.name + " is " + this.age + " years old");
};
//调用
var will = new Person("Will", 28);
will.getInfo();//"Will is 28 years old"

このように内部で new を直接使用して Jquery をビルドすると、明らかに問題が発生します。無限ループ。無限ループの問題を解決するには、次のコードを見てください:

rrreee 無限ループの問題は確かに解決されましたが、2 つのオブジェクトの属性に新たな問題が発見されたことがわかります。 a と b は共通です。 a.name 属性が na になり、b.name 属性も na に変更されます。これは、これが Jquery を指しているためです。 この問題を解決するには、Jquery() のたびに新しいオブジェクトが構築されるたびに呼び出すことができます。 改善されたコードは次のとおりです。 rrreee

このように処理した後、問題は発生します。属性の共有の問題は解決されており、各オブジェクトは独自の属性を持ち、自由に変更できます。各オブジェクトは相互に影響しませんが、コンソールに a.version 属性を出力すると、新しい問題が発見されたことがわかります。その理由は、Jquery .prototypeJquery.prototype.init.prototype が互いに無関係であるためです。 Jquery.prototype.init オブジェクトなので、Jquery.prototype.init.prototype のプロパティは読み取れないが、Jquery.prototype を読み取ることができません (この例では version プロパティを参照しています)。解決策は非常に簡単です。<code>Jquery.prototypeJquery.prototype.init.prototype に割り当てるだけです。これは、Jquery プロトタイプのすべての属性を Jquery.initに割り当てるのと同じです。 code のプロトタイプ> で、次のコードを見てください:

rrreee コンソールが次の version 属性を出力していることがわかります。読み取りおよび印刷できるオブジェクト。

この時点で、Jqueryの新規無料構築は完了しました。

追記:

jQuery.fn は実際には jQuery のプロトタイプです。jQuery ソース コードで次のステートメントを確認できます: jQuery.fn = jQuery.prototype = {}; $() と jquery() は実際には同じです。jquery ソース コードで次のステートメントを確認できます: window.jQuery = window.$ = jQuery;

プロトタイプ プロトタイプ

プロトタイプとは何か理解していますか?

JavaScript では、プロトタイプもオブジェクトです。プロトタイプを通じて、JavaScript オブジェクトにはすべて、オブジェクトのプロトタイプに対応する「[[Prototype]]」内部属性が含まれています。 。

2 つの属性「prototype」と「__proto__」は、完全に異なるものであるため、混同されることがあります。

ここで「プロトタイプ」と「__proto__」について簡単に説明します:

すべてのオブジェクトには、オブジェクトのプロトタイプに対応する __proto__ 属性があります

関数オブジェクトの場合、__proto__ を除く 属性に加えて関数がインスタンスを作成するコンストラクターとして使用される場合、関数のプロトタイプ属性値がプロトタイプとしてすべてのオブジェクト インスタンスに割り当てられます (つまり、インスタンスの __proto__ 属性を設定します)。 rreee 以上は皆さんのためにまとめたもので、今後皆さんのお役に立てれば幸いです。

🎜関連記事: 🎜🎜🎜 jquery のモバイルタッチスクリーンスライド機能について 🎜🎜🎜🎜 Mac に nvm をインストールする方法 (詳細なチュートリアル) 🎜🎜🎜🎜 WeChat アプレットに時刻関数を実装する方法 🎜🎜🎜🎜 webpack 🎜🎜 で生成されたコードを探索する

以上がjqueryでnewを使わずにビルドする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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