价值,原型和特性的差异

价值,原型和特性的差异

好!首先,这个问题来自于一个在jQuery宇宙中挖得太深(很可能迷路)的人。

在我的研究中,我发现了jquery的主要模式是这样的(如果需要更正的话):

(function (window, undefined) {

   jQuery = function (arg) {
      // The jQuery object is actually just the init constructor 'enhanced'
      return new jQuery.fn.init(arg);
   },
   jQuery.fn = jQuery.prototype = {
      constructor: jQuery,
      init: function (selector, context, rootjQuery) {
         // get the selected DOM el.
         // and returns an array
      },
      method: function () {
         doSomeThing();
         return this;
      },
      method2: function () {
         doSomeThing();
         return this;,
         method3: function () {
            doSomeThing();
            return this;
         };

         jQuery.fn.init.prototype = jQuery.fn;

         jQuery.extend = jQuery.fn.extend = function () {

            //defines the extend method 
         };
         // extends the jQuery function and adds some static methods 
         jQuery.extend({
            method: function () {}

         })

      })

$启动时,jQuery.prototype.init启动并返回一个元素数组。但我不明白它是如何增加了jQuery的方法类似.css.hide等。到这个数组。

我得到了静态方法。但是用所有这些方法都无法获得返回值和元素数组的方式。


墨色风雨
浏览 504回答 2
2回答

HUH函数

我也不喜欢这种模式。他们有一个init函数,它是所有jQuery实例的构造jQuery函数-该函数本身只是对象创建过程的包装器new:function jQuery(…) { return new init(…); }然后,他们将这些实例的方法添加到init.prototype对象中。该对象作为接口公开jQuery.fn。另外,他们将prototypejQuery函数的属性设置为该对象-对于不使用该fn属性的用户。现在你有jQuery.prototype = jQuery.fn = […]init.prototype但是他们也做两件事:覆盖constructor原型对象的属性,将其设置为jQuery函数公开init功能jQuery.fn-自己的原型。这可能允许扩展$ .fn.init函数,但非常令人困惑我认为他们需要/想要做所有这些事情以防万一,但是他们的代码是一团糟-从该对象文字开始,然后分配初始化原型。

红糖糍粑

如果将API视为方法的外部集合,而将jQuery函数视为包装器,则更容易消化。它的基本构造如下:function a() { return new b();}a.prototype.method = function() { return this; }function b() {}b.prototype = a.prototype;除了a是jQuery和b是jQuery.prototype.init。我确定Resig有将他的api构造函数放在init原型中的原因,但是我看不到它们。除了Bergi提到的以外,还有其他一些奇怪之处:1)图案需要从参考副本jQuery.fn.init.prototype到jQuery.prototype,至极允许怪异无端环:var $body = new $.fn.init.prototype.init.prototype.init.prototype.init('body');2)每个jQuery集合实际上是的一个实例jQuery.fn.init,但是由于它们引用相同的原型对象,因此欺骗我们“认为”该集合是的实例jQuery。您可以执行以下相同的魔术:function a(){}function b(){}a.prototype = b.prototype;console.log( new b instanceof a); // trueconsole.log( new a instanceof b); // true旁注:我个人使用了以下构造函数模式,结果相似但没有怪异:var a = function(arg) {     if (!(this instanceof a)) {         return new a(arg);     }};a.prototype.method = function(){ return this; };
打开App,查看更多内容
随时随地看视频慕课网APP