一、由jQuery创建类引发的问题

在用jQuery选择器时候,可以通过下面两种方式获取元素,并得到一个jQuery对象。

var d1 = jQuery('#demo01');
var d2 = new jQuery('#demo02');

上面两种方式操作结果一致,这让我很好奇,自己模拟了一个类似的实现。

(function(global, undefined){
var jQuery = function(selector, context){
if(!(this instanceof jQuery)) {
return new jQuery(selector, context);
}
/**
other code
**/
}
global.jQuery = jQuery;
})(window);

但是我发现这种方式好像也不杂滴,就跑去看了一下jquery源码的实现。

二、jQuery类的实现

 上图是自己画的jQuery类创建图。其中jQuery.fn.init函数完全可以用另外一个函数名代替。代码很简单,不能理解的可能就jQuery类的创建代码是如此的少,仅用return new一个实例化对象就结束,这个简洁的有点让人惊叹,同时充满疑问,你丫是怎么同时保证过通过new和不通过new创建对象保持一致的呢?带着这个疑问,我们得深入研究一下关键词new的工作原理。
 

三、new的工作原理

众所周知,JavaScript借鉴其他一些面向对象对象语言的语法糖来实现自己的一些面向对象过程,其中最典型的就是关键词new。
经过我一番测试后,对new一些理解:
1.通过操作构造函数实例化一个对象;
2.执行函数中如果有return,且返回值不是对象时候,直接抛弃,返回this,否则就return返回值对象。(之前这一点个人理解有误,这一点也是也就解释了上面jquery的那段代码)

至于new的工作原理,也很简单:

function createObject(constructor) {
var o = {}, //第一步,创建一个初始化对象。
params = [].slice.call(arguments,1) || []; //分离出参数
var tmp = constructor.apply(o, params); //第二步,切换作用域,让构造函数中的this指向当前对象o,然后执行构造函数函数。
if(typeof tmp != 'object') {
return tmp;
}
o.__proto__ = constructor.prototype; //第三步,设置原型链
o.constructor = constructor; //第四步,设置构造器
return o;
}

四、总结

这次文章比较水,知识点比较简单,但就这么简单的问题,我之前还没弄明白,的确惭愧。知识重在积累,我必须得不断学习。

jquery类的创建方式及关键字new的原理的更多相关文章

  1. Python 小知识点(7)--类的创建方式

    1. 创建类的第1方式(常用) class Foo(object): def func(self): print("Hello Foo") 2.创建类的第2方式 def func( ...

  2. JavaScript 中实现继承的方式(列举3种在前一章,我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。)

    第一种:对象冒充 function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.col ...

  3. 多线程-2.线程创建方式和Thread类

    线程的创建方式 1.继承Thread类,重写run方法,示例如下: 1 class PrimeThread extends Thread { 2 long minPrime; 3 PrimeThrea ...

  4. 多对多的三种创建方式-forms相关组件-钩子函数-cookie与session

    多对多的三种创建方式 1.全自动(推荐使用的**) 优势:第三张可以任意的扩展字段 缺点:ORM查询不方便,如果后续字段增加更改时不便添加修改 manyToManyField创建的第三张表属于虚拟的, ...

  5. Spring三 Bean的三种创建方式

    创建Bean的三种方式在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法.实际上,Spring ...

  6. JS类继承常用方式发展史

    JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...

  7. JAVA类的创建: 创建JAVA的类 ,JAVA的字段,JAVA类的方法

    1. 创建Java的类 如果说Java的一切都是对象,那么类型就是决定了某一类对象的外观与行为.可是类型的关键字不是type,而是class,创建一个新的类型要用下面的代码: 1 2 3 class ...

  8. python 通过元类控制类的创建

    一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...

  9. C++ 类模板三(类模版中的static关键字)

    //类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器 ...

随机推荐

  1. 【android】移植IOS视图响应陀螺仪交互行为

    IOS有个很有趣味的特性:背景图片可以响应陀螺仪方向的变化,去改变X.Y轴上的值,从而让整个界面看着充满着灵性.具体步骤是:解锁苹果产品,在IOS7以上,摆动手势,观察桌面背景图片的变化. 刚好,我们 ...

  2. 20155203 2016-2017-4 《Java程序设计》第8周学习总结

    20155203 2016-2017-4 <Java程序设计>第8周学习总结 教材学习内容总结 1.channel的继承架构 2.position()类似于堆栈操作中的栈顶指针. 3.Pa ...

  3. JS在if中的强制类型转换

    JS在if中的强制类型转换 众所周知,JS在很多情况下会进行强制类型转换,其中,最常见两种是: 1.使用非严格相等进行比较,对==左边的值进行类型转换 2.在if判断时,括号内的值进行类型转换,转化为 ...

  4. 20145314郑凯杰《网络对抗技术》可选实验 shellcode注入与Return-to-libc攻击实验

    20145314郑凯杰<网络对抗技术>可选实验 shellcode注入与Return-to-libc攻击实验 1.0 实践内容 Return-to-libc攻击是一种特殊的缓冲区溢出攻击, ...

  5. 关于LIS和LCS问题的o(nlogn)解法

    o(n^2)解法就不赘述了,直接解释o(nlogn)解法 LIS最长递增子序列: 先明确一个结论:在长度最大为len的递增序列里若末尾元素越小,该递增序列越容易和后面的子序列构造出一个更长的递增子序列 ...

  6. git commit的规范

    https://www.yuque.com/fe9/basic/nruxq8#6c228def 制定一个 git commit 信息的提交规范是开发团队工作流必不可少的环节.试想一下,如果查看主分支上 ...

  7. java分布式系统开关功能设计(服务升降级)

     ​问题一:在单个java系统中如何实现开关功能? ​    ​其实对于开关来说,对应Java中的类型,很好映射,就是一个boolean值,在需要做开关操作的地方,调用这个属性,判断状态,然后走相应的 ...

  8. Docker 安装&基本操作

    Docker 安装 Docker 中的三个概念:镜像,容器,仓库 镜像(image):Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器.Docker 提供了一个很简单的机制来 ...

  9. 安装pip最简单的方法

    http://blog.csdn.net/lyj_viviani/article/details/70568434

  10. express 调优的一个过程和心得,不错的文章

    Netflix的软件工程师Yunong Xiao最近在公司的技术博客上写了一篇文章,分析了他所在的团队在将Netflix网站UI转移到Node.js上时遇到的延迟问题.在文章中他描述了找到问题根本原因 ...