无 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. 转载--Typecho install.php 反序列化导致任意代码执行

    转载--Typecho install.php 反序列化导致任意代码执行 原文链接(http://p0sec.net/index.php/archives/114/) 0x00 前言 漏洞公布已经过去 ...

  2. x86平台上的Windows页表映射机制

    首先,在x86架构的处理器上,一个正常页面大小为4KB,非PAE模式下,CR3持有页目录页面的物理地址,PDE和PTE格式相同大小为4字节.此时每个页表页面包含1024个PTE,可以映射1024个页面 ...

  3. [react] 细数 React 的原罪

    Props & onChange 的原罪 .「props & onChange 接口规范」它不是一个典型的「程序接口规范」. 当你拿到一个可视组件的 ref,却没有类似 setProp ...

  4. Xshell显示图形化界面

    前言 很久没用过图形化界面了,都忘记怎么使用了.... 依据以往的经验都是由环境变量DISPLAY设置,然后就能连接了,每天也是匆匆忙忙的就过了一天,都不知道干了啥,分配的时间也少,但是一直纠结,进行 ...

  5. python_day06(ip代理池)

    from urllib.request import Request, ProxyHandler from urllib.request import build_opener from bs4 im ...

  6. windows 下更新 npm 和 node

    原文链接 公司的新项目要启动了,需要使用 Angular 4.0,并且使用 webpack 工具进行打包.所以就需要安装 node.node 的安装很简单,在 node 的官网 nodejs.org  ...

  7. POJ-1273-Drainage Ditches 朴素增广路

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 70588   Accepted: 2743 ...

  8. [CSS 混合模式]——mix-blend-mode/background-blend-mode简介

    mix-blend-mode/background-blend-mode CSS3真是有很多的神奇的地方,这个两个元素你知道吗? 这是张大大拿过来的图,关于混合模式,借图一用. mix-blend-m ...

  9. maven项目pom.xml配置文件依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  10. OpenXml读取word内容(二)

    注意事项 上一篇已经说明,这次就不一一说了,直接来正文: word内容 相关代码 方法1 static void Main(string[] args) { string wordPathStr = ...