无 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. Celery 源码解析八:State 和 Result

    在前面几篇解析中,我们已经看过了 Worker 是如何运行的,Task 是如何创建的,以及怎么被路由到 Worker 中,除了这些之外,我们还对流量限制,Worker 控制和 Task/Worker ...

  2. ssh 免密钥失败原因

    1.权限问题 本地端 ssh chmod 777 ~/.ssh sudo chmod 777 /home/当前用户 远程端 .ssh目录下的authorized_keys sudo chmod 777 ...

  3. Chapter 7:Linking

    概述: 在linux上,从c源码到可执行文件主要需要经历translator(compiler.assembler)生成object file,再经由linker连接成executable objec ...

  4. Science发表的超赞聚类算法

    作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚类算法, 可以识别各种形状的类簇, 并且其超参数很容易确定. 算法思想 该算法的假设是类簇的中心由一些局部 ...

  5. 微软云计算 Massive Data 处理语言Scope 1

    Massive Data处理一直是云计算中很重要的一个环节.目前像Google,Yahoo在相关方面都有自己专有的技术.例如Google的基于MapReduce的Sawzall语言.和Yahoo基于H ...

  6. SaltStack 架构自动部署 03

    架构图 模块化部署 系统模块:系统优化,内核参数,网络参数 功能模块:如:nginx,tomcat, 业务模块: 1.在salt-master端修改配置文件 [root@01 salt]# vim / ...

  7. Servlet中web.xml 以及 <url-pattern>总结

    web.xml中添加Servlet配置信息 使用Eclipse创建Servlet,会自动的在WEB-INF下的web.xml中声明,但是有的时候需要我们手动的写入配置信息,以下就是Servlet在we ...

  8. 计算出前N项的数据

    #include<iostream> #include<algorithm> #include<numeric> using namespace std; ; in ...

  9. HBase存储剖析与数据迁移

    1.概述 HBase的存储结构和关系型数据库不一样,HBase面向半结构化数据进行存储.所以,对于结构化的SQL语言查询,HBase自身并没有接口支持.在大数据应用中,虽然也有SQL查询引擎可以查询H ...

  10. 下拉菜单被挡住了,DIV置于最底层的方法

    网站常会用到一些 下拉菜单,,幻灯片,,,飘浮广告等. 但经常会发现.幻灯片会挡住下拉菜单或者飘浮广告等.解决办法有下 第一,可将幻灯片所在DIV 置于最底层.添加CSS如下 style=" ...