无 new 构造与链式调用
无 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 构造与链式调用的更多相关文章
- swift学习笔记之-可选链式调用
//可选链式调用 import UIKit /*可选链式调用(Optional Chaining) 1.在可选值上请求和调用该可选值的属性.方法及下标的方法,如果可选值有值,那么调用就会成功,返回可选 ...
- swift 学习- 19 -- 可选链式调用
// 可选链式调用 是一种在当前值可能为 nil 的可选值上请求 和 调用属性, 方法以及下标, 如果 可选值有值, 那么调用就会成功, 如果可选值是 nil, 那么就会将返回 nil , // 多个 ...
- 编程中的链式调用:Scala示例
编程中的链式调用与Linux Shell 中的管道类似.Linux Shell 中的管道 ,会将管道连接的上一个程序的结果, 传递给管道连接的下一个程序作为参数进行处理,依次串联起N个实用程序形成流水 ...
- 如何写 JS 的链式调用 ---》JS 设计模式《----方法的链式调用
1.以$ 函数为例.通常返回一个HTML元素或一个元素集合. 代码如下: function $(){ var elements = []; ;i<arguments.length;i++){ v ...
- 【Java】子类的链式调用
记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍 ...
- hasOwnProperty 递归 简单回调 链式调用
1.hasOwnProperty 函数的返回值为Boolean类型.如果对象object具有名称为propertyName的属性,则返回true,否则返回false. function Box(){ ...
- Swift2.1 语法指南——可空链式调用
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- JavaScript设计模式——方法的链式调用
方法的链式调用: (function() { //私有类 function _$ (els) { this.elements = []; for(var i = 0, len = els.length ...
- jQuery的XX如何实现?——2.show与链式调用
往期回顾: jQuery的XX如何实现?——1.框架 -------------------------- 源码链接:内附实例代码 jQuery使用许久了,但是有一些API的实现实在想不通.于是抽空看 ...
随机推荐
- MS10_087漏洞学习研究
类别:栈溢出,fileformat类别漏洞 描述: This module exploits a stack-based buffer overflow in the handling of the ...
- Android IntentService使用介绍以及源码解析
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.IntentService概述及使用举例 IntentService内部实现机制用到了HandlerThread,如果对HandlerThrea ...
- 【NOIP2015提高组】信息传递
https://www.luogu.org/problem/show?pid=2661 傻逼图论题,把我写成傻逼了. DFS找环,每个结点第二次访问时更新答案. 但是图会有几个连通块,所以要分开讨论. ...
- webrc视频数据发送处理流程详解
- 来自Ext的UI边界识别函数constrain
//constrain函数 var min = 1 var max = 3; var num = 4; var result = Math.min(Math.max(num,min),max); co ...
- Express4.x API (二):Request (译)
写在前面 最近学习express想要系统的过一遍API,www.expressjs.com是express英文官网(进入www.epxressjs.com.cn发现也是只有前几句话是中文呀~~),所以 ...
- linux kvm虚拟机使用
安装配置kvm 1.安装kvm软件包 [root@kvm ~]# yum install kvm python-virtinst libvirt tunctl bridge-utils virt-ma ...
- centos编译安装php5.6.20+nginx1.8.1+mysql5.6.17
LNMP 代表的就是:Linux系统下Nginx+MySQL+PHP这样的站点服务器架构. 本次实践需求: 实践centos6.5编译安装 LNMP生产环境 架构 web生产环境 使用 xcache ...
- Xamarin.iOS + MvvmCross: UIPickerView data binding, SelectedItemChanged event
UI initialization: _pickerView = new UIPickerView(); _pickerView.ShowSelectionIndicator = true; _pic ...
- WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
在 mkfs.ext4 /dev/sda2 格式化硬盘空间时,可能出现这种错误. had this situation at office where I was told to re-partiti ...