前提:
使用 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. qextserialport打不开com10及以上的串口

    需要在portname前添加\\\\.\\这样就可以了!! 例如 QString portname; portname.append("\\\\.\\").append(ui-&g ...

  2. java数据结构读书笔记--引论

    1 递归简论 需求:求出f(x)=2f(x-1)+x²的值.满足f(0)=0 public class Recursion { // 需求: 求出f(x)=2f(x-1)+x²的值.满足f(0)=0 ...

  3. mysql数据库int(5)以及varchar(20)长度表示的是什么?

    在mysql5.x版本的数据库中: int类型数据的字节大小是固定的4个字节: 但是int(5)和int(11)区别在于,显示的数据位数一个是5位一个是11位,在开启zerofill(填充零)情况下, ...

  4. Entity Framework Code-First(10.3):Property Mappings

    Property Mappings using Fluent API: Here, we will learn how to configure properties of an entity cla ...

  5. Entity Framework Code-First(9.11):DataAnnotations - InverseProperty Attribute

    DataAnnotations - InverseProperty Attribute: We have seen in the Code-First Convention section that ...

  6. raspberry是个什么玩意

    今天Wilson同学取回一个书本大小的包裹,说买回来一台小电脑,只有信用卡大小! 这是第一次听说和看见raspberry Pi. 一块开发板上有四个USB.一个视频接口.一个音频接口.一个网线接口和电 ...

  7. jquery筛选元素函数

    jquery筛选元素函数 1.过滤匹配第二个p元素: $("button").click(function(){ $("p").eq(1).css(" ...

  8. BKReboot

    1: 重启第一台服务器(中控机),容易引起故障的组件有: appt.bkdata, 重启顺序: bkdata->appt. 2: 重启第二台服务器,容易引起故障的组件有:appo.saas-o, ...

  9. 创建、配置Servlet

    1.创建Servlet 2.选择继承的类及需要覆盖的方法 3.Servlet结构 package com.sysker.servlet; import java.io.IOException; imp ...

  10. luogu1975 排队(分块)

    luogu1975 排队(分块) 给你一个长度为n的序列,每次交换给定的两个数,输出每次操作后的逆序对个数. 首先考虑求出刚开始的逆序对.接着相当于带修改的求区间中比x大的数. 可以用分块,每个块内排 ...