值,原型和财产的区别(Difference of the value, prototype and

2019-06-17 21:55发布

好! 首先,这个问题是来自一个男人谁挖得太深(和posibly丢失)在jQuery的宇宙。

在我RESERCH我发现了jQuery的主要模式是这样的(如果需要修正wellcomed):

(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等。 此阵列。

我得到的静态方法。 但无法得到它如何返回,并与所有这些方法元素的数组。

Answer 1:

我也不喜欢这种模式。 他们有一个init函数,这是所有的jQuery实例的构造-的jQuery功能本身就是围绕对象创建一个包装new

function jQuery(…) { return new init(…); }

然后,他们添加这些实例的方法对init.prototype对象。 这个目的是公开为在界面jQuery.fn 。 此外,他们设置了prototype jQuery的功能到该对象的属性-对于那些谁不使用fn属性。 现在你有

jQuery.prototype = jQuery.fn = […]init.prototype

但他们也做了两[怪异]的事情:

  • 覆盖constructor的原型对象的属性,将其设置为jQuery功能
  • 露出init的功能jQuery.fn -它自己的原型。 这可能允许扩展$ .fn.init功能 ,但非常混乱

我认为他们需要/想做到这一切是傻瓜式的证明,但他们的代码是一个烂摊子 - 开始与该对象字面事后分配初始化原型的东西。



Answer 2:

它很容易,如果你认为的API作为方法外集合,jQuery函数作为包装来消化。

它的构造方式基本是这样的:

function a() { return new b();}
a.prototype.method = function() { return this; }
function b() {}
b.prototype = a.prototype;

除了ajQuerybjQuery.prototype.init

我敢肯定,Resig的有他的理由放置API构造在init原型,但我看不到他们。 一对夫妇除了BERGI提到的那些更多的陌生感:

1)图案需要从参考副本jQuery.fn.init.prototypejQuery.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); // true
console.log( new a instanceof b); // true

旁注:我曾亲自使用与不古怪类似的结果下面的构造模式:

var a = function(arg) {
    if (!(this instanceof a)) {
        return new a(arg);
    }
};
a.prototype.method = function(){ return this; };


文章来源: Difference of the value, prototype and property