前提:
使用 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. 拍照选择图片(Activity底部弹出)

    效果图如下: 第一步 : 显示出的布局文件:alert_dialog.xml <?xml version="1.0" encoding="utf-8"?& ...

  2. Spinner 通过XML形式绑定数据时 无法从String.xml中读取数组

    在android应用程序中,通过XML形式给Spinner绑定数据,如果把数组放在系统的string.xml文件里,那么就有可能在运行时无法找到,导致程序异常结束,解决方法是自建一个XML文件来存放数 ...

  3. 【总结整理】关于IE6的兼容性

    1. /*IE6兼容性,input边框border:none无效,不能去掉,只能把背景颜色去掉*/ background: none; /*background-color:#fff ;*/ 2. / ...

  4. Servlet处理流程分析

    ---------------siwuxie095                                 Tomcat 处理客户端请求的方式:     Tomcat 既是一个 Servlet ...

  5. koa2,koa1框架安装

    koa2版本安装: npm install koa@ -g hello2.js var Koa = require('koa'); var app = new Koa(); app.use(ctx = ...

  6. Jmeter JDBC Request的sql语句不支持;号

    Jmeter JDBC Request的sql语句不支持:号,如果要批量插入数据,则需要使用以下方式 INSERT INTO bank_info( `id`, `bank_code`, `bank_n ...

  7. Java中编写线程安全代码的原理(Java concurrent in practice的快速要点)

    Java concurrent in practice是一本好书,不过太繁冗.本文主要简述第一部分的内容. 多线程 优势 与单线程相比,可以利用多核的能力; 可以方便的建模成一个线程处理一种任务; 与 ...

  8. Python开发【第六篇】:文件处理

    1. 文件   文件处理流程: 打开文件,获得文件句柄,并赋值 通过句柄对文件进行操作 关闭文件 1.1 打开文件   在 Python 中使用 open()函数打开文件,并返回文件对象: open( ...

  9. wpf listboxitem添加下划线

    1.通过List<string>进行赋值,没有字段绑定 // 前台xaml <ListBox x:Name="list1"> <ListBox.Ite ...

  10. JAVA中的工厂方法模式和抽象工厂模式

    工厂方法模式: 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类.类型:创建类模式类图: 类图知识点:1.类图分为三部分,依次是类名.属性.方法2.以& ...