前提:
使用 JS 创建对象的最优办法,是 原型模式。
 
step1: 原型模式的基础使用方式
    function fn(){}
    fn.prototype = {}
 
    var x = new fn();
    x.aaa();
 
缺点:使用 fn.prototype 中的成员时,需要先创建 fn的实例:var x = new fn();
麻烦,希望不需要每次都实例化。
 
尝试1: 让 fn()返回 fn的实例,即返回 new fn();
function fn(){
    return new fn();
}
结果:死循环.
分析:希望返回 实例的原因是因为 希望通过实例访问定义在原型中的方法。
但是:访问呢定义在原型中的方法,不仅仅可以通过实例,还可以 直接返回原型对象。
 
尝试2: 让 fn()返回 fn.prototype,即返回 自己的原型。
function fn(){
    return fn.prototype;
}
 
下面一步想不到,假设 jquery的作者跳跃到使用这一步。
直接返回 fn.prototype 也可以使用另外一种方式实现:
1 在 fn.prototype 中定义一个方法, init()
2 在 init() 中返回 this:this指向 fn.prototype
3 在 fn() 中返回 fn.prototype.init();
 
function fn(){
    return fn.prototype.init();
}
fn.prototype = {
    init:function(){
        return this;
    }
}
 
结果:可以访问 定义在 fn.prototype中的成员。但是不仅仅可以访问,还可以修改。
我们不允许修改定义在 fn.prototype 中的方法。
 
解决:使用new 运算符.
规则:new 可以使得实例只能读取其构造函数prototype但是无法修改。
 
function fn(){
    return new fn.prototype.init();
}
fn.prototype = {
    init:function(){
        return this;
    }
}
 
问题:当前返回的 实例是 init()的实例,但是所有的成员都是定义在 fn.prototype 上面。
所以需要让 init.prototype 指向 fn.prototype:
 
fn.prototype.init.prototype = fn.prototype;
 
将所有的代码放到独立命名空间中.
(function(){
    function fn(){
        return new fn.prototype.init();
    }
    fn.prototype = {
        constructor:fn,
        init:function(){}
    }
    fn.prototype.init.prototype = fn.prototype;
    window._ = fn;
})();

jQuery 结构的实现思路的更多相关文章

  1. 【学】jQuery的源码思路1——后代选择器

    jQuery的源码思路1--后代选择器 这里探讨一下jQuery中后代选择器的封装原理,并自己写一下 getEle('#div1 ul li .box');接受的参数就是个后代选择器,类似于这样: # ...

  2. 安全、结构良好的jQuery结构模板

    安全.结构良好的jQuery结构模板 ;(function($,window,document,undefined){ //我们的代码- })(jQuery,window,document);   参 ...

  3. 【学】jQuery的源码思路2——$符号是如何封装的

    jQuery中的$符号功能很强大,原因在于对函数参数的个数以及种类的控制,还有对于面向对象思想的运用 function jQuery(args){ //接受参数,并对其判断 this.elements ...

  4. jQuery1.11源码分析(6)-----jQuery结构总揽

    (在看以下内容之前请先对原型链有一定的了解,比如:prototype是对象还是函数?) 在看jQuery的其他源码之前,必须对jQuery的数据结构有一定的了解. jQuery的核心很简单,jQuer ...

  5. jquery源码学习(一)——jquery结构概述以及如何合适的暴露全局变量

    jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jq ...

  6. 【学】jQuery的源码思路4——增加一些功能

    本文说一些简单的jQuery实现原理 eq() get() hide() show() index() find() //返回找到的一组元素中的第n个 zQuery.prototype.eq=func ...

  7. 【学】jQuery的源码思路3——添加事件及其他

    这段添加的方法有: 各类事件函数 css() addEvent() toggle() //添加各种事件,将常用的事件名称放入数组,然后循环着加入到zQuery对象的原型上 var eventArr = ...

  8. CMDB服务器管理系统【s5day89】:部分数据表结构-资产入库思路

    1.用django的app作为统一调用库的好处 1.创建repository app截图如下: 2.好处如下: 1.app的本质就是一个文件夹 2.以后所有的app调用数据就只去repository调 ...

  9. 为jquery添加扩展标准思路

    jquery扩展分为对象扩展和jquery本身类扩展: 对象扩展: (function($){ $.fn.abc = function(){ console.log($(this).get(0)); ...

随机推荐

  1. oracle--事物---

    一.什么是事务 事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml(数据操作语言,增删改,没有查询)语句要么全部成功,要么全部失败. 如:网上转账就是典型的要用事务来处理,用于保证数 ...

  2. jquery 键盘事件的使用方法详解

    转自:https://www.jb51.net/article/123579.htm jQuery处理键盘事件有三个函数,根据事件发生的顺序分别是: jquery 代码: 1.  keydown(); ...

  3. mysql软文

    常用的MySQL复杂查询语句写法 http://www.blogjava.net/bolo/archive/2015/02/02/422649.html   mysql sql常用语句大全 http: ...

  4. jsp 路径问题

    <script   type="text/javascript"   src="<%=ApplicationContextUtil.getBasePath(r ...

  5. Linux下部署MySQL,大小写敏感踩坑记录

    今天在将开发环境中的门户数据库复制到新环境后,使用SqlSugar的ORM框架进行数据库操作的时候,出现了主键找不到的现象.排查了很久终于发现了关键点.特此记录. 1.开发环境:    操作系统:CE ...

  6. ls- 查看文件信息

    通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限),查看目录信息等等,ls 命令在日常的linux操作中用的很多,在此给大家介绍一下ls 命令的使 ...

  7. [trie]字典树模板

    #include<bits/stdc++.h> using namespace std; typedef long long ll; struct trie{ int count; tri ...

  8. Leetcode:206. Reverse Linked List

    这题直接ac掉 class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; while(he ...

  9. python的virtualenv环境与使用

    1.安装virtualenv 在安装virtualenv之前,我们需要安装至少有一个版本的Python:因为virtualenv是python的一个第三方模块,必须基于python环境才能安装: 如果 ...

  10. 2010辽宁省赛F(字典树,动态规划)

    #include<bits/stdc++.h>using namespace std;int n,x;char s[10010];char a[31010];int val[100010] ...