前提:
使用 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. javascript面向对象的测试实例

  2. 14、SRA数据上传

    1.ncbi登陆,进入SRA,进入new submission 2. 1)SUBMITTER 2)PROJECT TYPE Raw sequence reads 和 ranscriptome or G ...

  3. p1345 奶牛的电信Telecowmunication

    传送门 题目 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a ...

  4. MQTT协议实现Eclipse Paho学习总结二

    一.概述 前一篇博客(MQTT协议实现Eclipse Paho学习总结一) 写了一些MQTT协议相关的一些概述和其实现Eclipse Paho的报文类别,同时对心跳包进行了分析.这篇文章,在不涉及MQ ...

  5. 3. 从零开始学CSRF

    为什么要拿CSRF来当“攻击手法系列”的开头篇呢?因为CSRF/XSRF我个人喜爱他的程度已经超过XSS了.如果说XSS是一个老虎,那么CSRF就是隐藏在暗处的蛇.‍‍‍‍‍‍ ‍‍相信现在很多人不明 ...

  6. NULL 与 ""

    char *str1 = NULL; //str1为空 char *str2 = ""; //str2为一个空字符串 NULL没有分配空间,""分配了空间.

  7. springboot 使用war包部署

    ps://www.cnblogs.com/jiaoyiping/p/4251718.html

  8. Java Script 学习笔记 -- Ajax

    AJAX 一 AJAX预备知识:json进阶 1.1 什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javas ...

  9. C# Collection was modified;enumeration operation may not execute

    一.问题描述 在做 数组.列表.集合遍历时,可能我们会遇见这个问题.Collection was modified;enumeration operation may not execute ,翻译的 ...

  10. 前端中的事件循环eventloop机制

    我们知道 js 是单线程执行的,那么异步的代码 js 是怎么处理的呢?例如下面的代码是如何进行输出的: console.log(1); setTimeout(function() { console. ...