jquery类的创建方式及关键字new的原理
一、由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类的实现

三、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的原理的更多相关文章
- Python 小知识点(7)--类的创建方式
1. 创建类的第1方式(常用) class Foo(object): def func(self): print("Hello Foo") 2.创建类的第2方式 def func( ...
- JavaScript 中实现继承的方式(列举3种在前一章,我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。)
第一种:对象冒充 function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.col ...
- 多线程-2.线程创建方式和Thread类
线程的创建方式 1.继承Thread类,重写run方法,示例如下: 1 class PrimeThread extends Thread { 2 long minPrime; 3 PrimeThrea ...
- 多对多的三种创建方式-forms相关组件-钩子函数-cookie与session
多对多的三种创建方式 1.全自动(推荐使用的**) 优势:第三张可以任意的扩展字段 缺点:ORM查询不方便,如果后续字段增加更改时不便添加修改 manyToManyField创建的第三张表属于虚拟的, ...
- Spring三 Bean的三种创建方式
创建Bean的三种方式在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法.实际上,Spring ...
- JS类继承常用方式发展史
JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...
- JAVA类的创建: 创建JAVA的类 ,JAVA的字段,JAVA类的方法
1. 创建Java的类 如果说Java的一切都是对象,那么类型就是决定了某一类对象的外观与行为.可是类型的关键字不是type,而是class,创建一个新的类型要用下面的代码: 1 2 3 class ...
- python 通过元类控制类的创建
一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...
- C++ 类模板三(类模版中的static关键字)
//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器 ...
随机推荐
- HTML5实现手机QQ表情功能
主要素材和JS来自QQ空间触屏版( http://m.qzone.com ),我只是代码的搬运工.代码下载. 预览请使用较新版的Chrome,然后启用开发者工具,设备模式.详见:(http://www ...
- mongodb的安装和权限管理
mongodb4.0已经发布,但是鉴于线上环境更多的是使用旧版本的mongodb,我们这里使用的mongodb3.4版本. 官网下载地址为:https://fastdl.mongodb.org/lin ...
- Python面试题之Python反射详解
0x00 前言 反射,可以理解为利用字符串的形式去对象中操作成员属性和方法 反射的这点特性让我联想到了exec函数,也是把利用字符串的形式去让Python解释器去执行命令 Python Version ...
- # 20145122 《Java程序设计》第3周学习总结
教材学习内容总结 1一类一文件. 2一个原始码中只能有一个公开类,一个类定义产生一个.class文档. 3如果参考名称与数据成员同名时,将参数的值指定给对象的数据成员时要在数据成员前加this. 4当 ...
- Qt5_TCP_Client01
ZC: 代码来自<<Qt及Qt Quick开发实战精解>>“代码\src\5\5-3”(“代码\src\5\5-4”里面的代码差不多,不知有何差别...貌似应该是更为完善) Z ...
- 辗转相除法 & 裴蜀定理
2018-03-11 17:39:22 一.辗转相除法 在数学中,辗转相除法,又称欧几里得算法(英语:Euclidean algorithm),是求最大公约数的算法.辗转相除法首次出现于欧几里得的&l ...
- ping 原理与ICMP协议[转]
原文:http://blog.csdn.net/inject2006/article/details/2139149 ping 的原理 ping 程序是用来探测主机到主机之间是否可通信,如果不 ...
- RJ45接口
什么是rj45接口? rj45是各种不同接头的一种类型,通常用于数据传输,最常见的应用为网卡接口. 常见的RJ45接口有两类:用于以太网网卡.路由器以太网接口等的DTE类型,还有用于交换机等的DCE类 ...
- Java 数组如何转成List集合
问题描述:对于给定的如下数组,如何转换成List集合? String[] array = {"a","b","c"}; 参考stackove ...
- (GoRails)ActiveRecord --explain方法:(优化你的查询)
https://gorails.com/episodes/activerecord-explain?autoplay=1 比如没有加index的查询和加了index的查询,调用数据库的速度就差5倍. ...