ホームページ  >  記事  >  ウェブフロントエンド  >  新規なしの施工を詳しく解説

新規なしの施工を詳しく解説

php中世界最好的语言
php中世界最好的语言オリジナル
2018-03-15 16:04:141467ブラウズ

今回は新築フリー構築について詳しく解説していきます。 新築フリー構築を利用する際の注意点とは何なのか、実際の事例を交えて見ていきましょう。

はじめに

オブジェクトを作成したい場合、新しいメソッドを使用してオブジェクトを構築することができます。jqueryもオブジェクトであるため、new jquery() code> を使用して jquery オブジェクトを作成し、<code>$(ele) と同様のメソッドを直接使用してみてはいかがでしょうか。 code> jqueryオブジェクトを構築するには?実際、new は依然として内部でビルドに使用されていますが、jquery は内部でのビルドに役立ちます。以下のコードを参照してください

function Jquery(selector, context) {
  return new Jquery(selector, context);
 }
 Jquery.prototype = {
  version:'1.01'
 }
new jquery()来构建呀为什么我们创建jquery对象不用new jquery()而是直接使用类似$(ele)的方式去构建出来一个jquery对象呢?其实内部还是使用了new来构建的,只是jquery内部帮我们构建了而已,请看下面代码
function Jquery(selector, context) {
 return Jquery.prototype.init(selector, context);
}
Jquery.prototype = {
 version:'1.01',
 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

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

function Jquery(selector, context) {
 return new Jquery.prototype.init(selector, context); //注意看,这里多了个new
}
Jquery.prototype = {
 version:'1.01',
 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和b两个对象的属性是公用的,我修改a.name属性为na,b.name属性也跟着变为了na,其原因就是this都是指向Jquery的

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

function Jquery(selector, context) {
 return new Jquery.prototype.init(selector, context);
}
Jquery.prototype = {
 version:'1.01',
 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.prototypeJquery.prototype.init.prototype是互不相干的,我们创建的是Jquery.prototype.init对象,所以只能读到Jquery.prototype.init.prototype上的属性而读取不到Jquery.prototype上的属性的(该例指version这个属性),解决办法很简单,就是把Jquery.prototype赋值给Jquery.prototype.init.prototype,这样就相当于把Jquery原型上的属性全部赋值到了Jquery.init的原型上,请看下面代码:

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"

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

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

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

  $()和jquery()其实是一样的,jquery源码可以看到该条语句: window.jQuery = window.$ = jQuery; Jquery をビルドするために内部で直接 new を使用すると、明らかに問題が発生し、無限ループが形成されます。 。無限ループの問題を解決するには、次のコードを見てください:

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

では、オブジェクトのプロパティは、プロトタイプ

Inheritance

を通じて実現できます。これは、 に対応する "[[Prototype]]" 内部プロパティを含みます。オブジェクトのプロトタイプ。

「prototype」と「

proto」の 2 つの属性は、「person.prototype」と「person.proto」はまったく異なるものであるため、混同されることがあります。

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

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

関数オブジェクトの場合は、proto 属性に加えて, また、prototype 属性もあります。関数を🎜コンストラクター🎜として使用してインスタンスを作成すると、その関数のprototype属性値がプロトタイプとしてすべてのオブジェクトインスタンスに割り当てられます(つまり、オブジェクトのproto属性を設定します)。例) 🎜rrreee🎜 これを読んだと思います。この記事の場合の方法はマスターしました。さらに興味深い情報については、PHP 中国語 Web サイトの他の関連記事に注目してください。 🎜🎜推奨読書: 🎜🎜🎜 2 つの zTree が相互に対話する方法🎜🎜🎜🎜🎜 webpack を使用して jquery 環境設定を記述する方法🎜🎜🎜

jacksonがjson文字列を解析するときに大文字と小文字を自動的に変換する方法

jQuery EasyUIの折りたたみパネルの使用方法

以上が新規なしの施工を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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