今回は新築フリー構築について詳しく解説していきます。 新築フリー構築を利用する際の注意点とは何なのか、実際の事例を交えて見ていきましょう。
はじめに
オブジェクトを作成したい場合、新しいメソッドを使用してオブジェクトを構築することができます。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.prototype
和Jquery.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 を使用すると、明らかに問題が発生し、無限ループが形成されます。 。無限ループの問題を解決するには、次のコードを見てください:
無限ループの問題は確かに解決されましたが、2 つのオブジェクトの属性に新たな問題が発見されたことがわかります。 a と b は共通です。 a.name
属性が na になり、b.name
属性も na に変更されます。 これは、Jquery をポイントしているためです。 この問題を解決するには、Jquery()
を実行するたびに、新しいオブジェクトが構築されるたびに呼び出すことができます。 改善されたコードは次のとおりです。 rrreee このように処理した後、問題は発生します。属性の共有の問題は解決されました。各オブジェクトは独自の属性を持ち、自由に変更できます。各オブジェクトは相互に影響しませんが、コンソールに a.version 属性を表示すると、新しい問題が発見されました。その理由は、Jquery .prototype
と Jquery.prototype.init.prototype
が互いに無関係であるためです。 Jquery.prototype.init オブジェクトなので、Jquery.prototype.init.prototype
のプロパティは読み取れないが、Jquery.prototype を読み取ることができません (この例では version プロパティを参照しています)。解決策は非常に簡単です。<code>Jquery.prototype
を Jquery.prototype.init.prototype
に割り当てるだけです。これは、Jquery プロトタイプのすべての属性を Jquery.init
に割り当てることと同じです。 code のプロトタイプ> で、次のコードを見てください:
コンソールが次の version 属性を出力していることがわかります。読み取りおよび印刷できるオブジェクト。 この時点で、Jqueryの新規無料構築は完了しました。
追記: jQuery.fn は実際には jQuery のプロトタイプです。jQuery ソース コードで次のステートメントを確認できます: jQuery.fn = jQuery.prototype = {};
window.jQuery = window.$ = jQuery;
プロトタイプ プロトタイプ
プロトタイプとは何か理解していますか?
では、オブジェクトのプロパティは、プロトタイプInheritance
を通じて実現できます。これは、 に対応する "[[Prototype]]" 内部プロパティを含みます。オブジェクトのプロトタイプ。 「prototype」と「proto」の 2 つの属性は、「person.prototype」と「person.proto」はまったく異なるものであるため、混同されることがあります。
すべてのオブジェクトには、オブジェクトのプロトタイプに対応する proto 属性があります
jacksonがjson文字列を解析するときに大文字と小文字を自動的に変換する方法
以上が新規なしの施工を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。