无 new 构造

最简单的想法

(function(window) {
var jQuery = function() {
return new _jQuery();
}; var _jQuery = function() {}; window.jQuery = window.$ = jQuery;
})(window);

这个实现挺好的,能达到无 new 构造的要求,不过并不利于扩展,比如下面这段代码:

jQuery.prototype.test = function() {
console.log("test");
};

在原版 jQuery 下是这样的结果:

在我这个简化山寨版下是这样:

小小改动

(function(window) {
var jQuery = function() {
return new jQuery();
}; window.jQuery = window.$ = jQuery;
})(window);

彻底歇菜,死循环了:

this 的指向

这段代码是我打瞌睡的时候写的,真照着 jQuery 源码来写是写不出来的:

(function(window) {
var jQuery = function() {
return jQuery.prototype.init();
}; jQuery.prototype.init = function() {
return this;
}; window.jQuery = window.$ = jQuery;
})(window);

跑上面的测试都没有问题,非常完美,最起码我开始写出来的时候是这么认为的,不过我又写了段测试,就发现问题了:

$() === $();

结果竟然是 true

$() === $.prototype;

再看这个,结果也是 true,就明白是为什么了,同时 this 指向也搞清楚了,指向的是 jQuery.prototype

new 起来

(function(window) {
var jQuery = function() {
return new jQuery.prototype.init();
}; jQuery.prototype.init = function() {}; window.jQuery = window.$ = jQuery;
})(window);

还存在一个问题就是,返回的是 jQuery.prototype.init 的一个实例,jQuery 原型上的方法一个都访问不了。

原型链修复

(function(window) {
var jQuery = function() {
return new jQuery.prototype.init();
}; jQuery.prototype.init = function() {}; jQuery.prototype.init.prototype = jQuery.prototype; window.jQuery = window.$ = jQuery;
})(window);

链式调用

这个看起来高大上,实现起来其实很简单,每个方法返回 this 就行了:

(function(window) {
var jQuery = function() {
return new jQuery.prototype.init();
}; jQuery.prototype.init = function() {}; jQuery.prototype.init.prototype = jQuery.prototype; jQuery.prototype.test = function() {
return this;
} window.jQuery = window.$ = jQuery;
})(window);

代码地址

https://github.com/oldmanscode/jq_step_by_step/blob/master/step2.js

无 new 构造与链式调用的更多相关文章

  1. swift学习笔记之-可选链式调用

    //可选链式调用 import UIKit /*可选链式调用(Optional Chaining) 1.在可选值上请求和调用该可选值的属性.方法及下标的方法,如果可选值有值,那么调用就会成功,返回可选 ...

  2. swift 学习- 19 -- 可选链式调用

    // 可选链式调用 是一种在当前值可能为 nil 的可选值上请求 和 调用属性, 方法以及下标, 如果 可选值有值, 那么调用就会成功, 如果可选值是 nil, 那么就会将返回 nil , // 多个 ...

  3. 编程中的链式调用:Scala示例

    编程中的链式调用与Linux Shell 中的管道类似.Linux Shell 中的管道 ,会将管道连接的上一个程序的结果, 传递给管道连接的下一个程序作为参数进行处理,依次串联起N个实用程序形成流水 ...

  4. 如何写 JS 的链式调用 ---》JS 设计模式《----方法的链式调用

    1.以$ 函数为例.通常返回一个HTML元素或一个元素集合. 代码如下: function $(){ var elements = []; ;i<arguments.length;i++){ v ...

  5. 【Java】子类的链式调用

    记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍 ...

  6. hasOwnProperty 递归 简单回调 链式调用

    1.hasOwnProperty 函数的返回值为Boolean类型.如果对象object具有名称为propertyName的属性,则返回true,否则返回false. function Box(){ ...

  7. Swift2.1 语法指南——可空链式调用

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  8. JavaScript设计模式——方法的链式调用

    方法的链式调用: (function() { //私有类 function _$ (els) { this.elements = []; for(var i = 0, len = els.length ...

  9. jQuery的XX如何实现?——2.show与链式调用

    往期回顾: jQuery的XX如何实现?——1.框架 -------------------------- 源码链接:内附实例代码 jQuery使用许久了,但是有一些API的实现实在想不通.于是抽空看 ...

随机推荐

  1. 【SpringMVC】使用Myeclipse创建SpringMVC项目【超详细教程】

    之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...

  2. JavaEE中的MVC(五)定制Struts——Action跳转JSP

    在JavaEE中的MVC(三)中,我在Servlet中引入了命令模式的使用,采用Xml配置的方式,实现了一个Servlet调用多个不同的Action类,但是还不能实现页面地跳转,这一篇博客从之前的代码 ...

  3. C语言之++--

    #include<stdio.h>int main(){int num,count=0,i=0;scanf("%d",&num);printf("nu ...

  4. 【设计模式系列】之OO面向对象设计七大原则

    1  概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2  七大OO面向对象设计 2.1 单一 ...

  5. python解释执行原理(转载)

    Python解释执行原理 转自:http://l62s.iteye.com/blog/1481421 这里的解释执行是相对于编译执行而言的.我们都知道,使用C/C++之类的编译性语言编写的程序,是需要 ...

  6. Docker理解

    近期一直在研究Docker,感悟颇深,和大家分享一下Docker 在云计算中的应用和Docker的原理. Docker 用法https://yeasy.gitbooks.io/docker_pract ...

  7. 排列oj

    835:排列 总时间限制: 5000ms 内存限制: 65536kB 描述 题目描述: 大家知道,给出正整数n,则1到n这n个数可以构成n!种排列,把这些排列按照从小到大的顺序(字典顺序)列出,如n= ...

  8. oracle触发器 调用 web接口

    最近要求开发当数据表发生变化的时候调用web接口的需求,上网找了好几篇文章看着都觉得不是很好,也根据别人的思路去实现了下,感觉都不太理想,最后使用URLConnection实现了调用.具体查看一下代码 ...

  9. mysql分区分表

    为毛要分表和分区,,,,所有数据库的通病,文件越大,性能越低...那问题就来了.数据越多文件越大...无解?哎,所以说知道 为毛要分区了吧!那分表又是毛线?分表就是把一张表拆分成若干表,,,根据情况常 ...

  10. nignx 测试配置文件

    nginx -t nginx: the configuration file /usr/local/nginx-1.2.9/conf/nginx.conf syntax is ok nginx: co ...