一、由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. 能否通过六面照片构建3D模型?比如人脸,全身的多角度照片,生成3D模型。?

    https://www.zhihu.com/question/36412840 9023 ​添加评论 ​分享 ​邀请回答​举报 ​ 收起 已关注写回答   9 个回答 默认排序​ 叛逆者 计算机图形学 ...

  2. pyDay10

    内容来自廖雪峰的官方网站. 1.python的赋值语句:a, b, c = x, y, z 相当于 a = x, b = y, c = z.(事实上等式右边是一个tuple) 2.获得genarato ...

  3. [问题解决]win10误删启动项(BCD)(HP电脑亲测,无需启动盘,并非重装系统)

    昨天使用easyBCD软件,开始不太懂,手残把win10的引导删除了,后来发现电脑关机总是变成重启,无奈强制关机.今天重启了一下电脑,发现电脑已经无法打开了,这才明白昨天是误删了win10的BCD. ...

  4. kylin-cube存储结构

    前言 本篇文章通过图文的方式分析不同维度组合下的cube在hbase中的存储结构 需要声明的是,kylin不存原始数据,存储cube 全维度构建 假设一张表有3个字段name,age,sex,那么当通 ...

  5. building '_mysql' extension error: [WinError 2] 系统找不到指定的文件。

    D:\4yanjiiu\APIzidong\MySQL-python-1.2.5>py running install running bdist_egg running egg_info wr ...

  6. UOJ #185【ZJOI2016】 小星星

    题目链接:小星星 首先有个暴力很好想.令\(f_{i,j,S}\)表示把\(i\)这棵子树对应到原图中的\(S\)集合,\(i\)号点对应到了\(j\)号点的方案数.这玩意儿复杂度是\(O(3^nn^ ...

  7. 前端基础3:js篇(基础及算法)

    1.js闭包相关: 题1: for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000 * i); ...

  8. Mac Hadoop2.6(CDH5.9.2)伪分布式集群安装

    操作系统: MAC OS X 一.准备 1. JDK 1.8 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...

  9. 改变VO中的sql

    cuxOptionVO.setFullSqlMode(cuxOptionVO.FULLSQL_MODE_AUGMENTATION); cuxOptionVO.setQuery(null); cuxOp ...

  10. IOS-适配iOS10以及Xcode8

    现在在苹果的官网上,我们已经可以下载到Xcode8的GM版本了,加上9.14日凌晨,苹果就要正式推出iOS10系统的推送了,在此之际,iOS10的适配已经迫在眉睫啦,不知道Xcode8 beat版本, ...