JavaScript中,关于new的那些事
这篇文章是自己对new学习过程中的一些理解,有不对的地方希望指出,接受组织的批评教育。
导火线,前段时间学习jQuery的时候,看到源码中有这样一段:
jQuery = function(selector, context) {
return new jQuery.fn.init(selector, context);
}
短时间内,对于我这种初学者来说,感觉信息量有点大。第一,jQuery.fn是什么东西;第二,new加上后面那一大串返回什么;第三,看上是jQuery的构造函数,为什么要这么折腾。
好,经过一段时间的研究,慢慢来解答。
首先,jQuery.fn就是jQuery.prototype,相当于给jQuery原型弄了个马甲,看起来短一些。
其次,init方法在jQuery的原型中有定义,大概做的几件事就是:
- 把selector与context传给jQuery选择器引擎Sizzle建立元素列表
- 返回jQuery实例对象
好,也就是说,不管怎么折腾,init返回的就是JQuery实例对象。接下来看一下某大神对new的一个说明:
只要new表达式之后的constructor返回(return)一个引用对象(数组,对象,函数等),都将覆盖new创建的匿名对象;如果返回(return)一个原始类型(无return时其实为return原始类型undefined),那么就返回new创建的匿名对象。
有了这段解答,那么,姑且猜测new jQuery.fn.init(selector, context)
返回的就是jQuery对象。
接下来验证一下,先来代码:
function demo1 () {
return {
name: "Ichigo",
firstName: "Kurosaki"
}
} function demo2 () {
return ["bleach"];
} function demo3 () {
return function () {
var str = "doNothing";
}
} function demo4 () {
this.name = "Bruce";
this.firstName = "Wayen";
return this.name + " " + this.firstName;
} console.log(new demo1()); // Object {name: "Ichigo", firstName: "Kurosaki"}
console.log(new demo2()); // ["bleach"]
console.log(new demo3()); // function () {var str = "doNothing";}
console.log(new demo4()); // demo4 {name: "Bruce", firstName: "Wayen"}
可以看到运行结果与描述一致,demo1-3都被构造函数的返回值覆盖了,demo4返回了一个原始类型,因此new操作之后返回的就是demo4匿名对象。要提一下的是,原始类型指的是String,Boolean,Number,Undefined,Null这5类。测试代码就不贴出来了。
好了,这下new在背后干的勾当已经基本弄清了,但是jQuery中还有一段定义init.prototype = jQuery.fn
这就关系到jQuery隐藏实例方法跟属性的问题,具体我就不再表达自己那些浅显的见解,有高手已经解答
,地址:jQuery诞生记-原理与机制,感兴趣的同学可以去看。
JavaScript中,关于new的那些事的更多相关文章
- 关于javascript中this的那点事
this可谓是JavaScript中的开发神器,使用得当的话不仅有事半功倍的效果,而且代码的逼格也更高.但是既然是神器,如果你没有足够的功力的话,那么就不要使用它,否则就有可能自毁身亡.曾几何时,我偶 ...
- js学习笔记----JavaScript中DOM扩展的那些事
什么都不说,先上总结的图~ Selectors API(选择符API) querySelector()方法 接收一个css选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null ...
- javascript中 关于eval的那些事
javascript中的eval是一个非常灵活,但是灵活是伴随着风险的. 一.下面我们来看看那使用eval声明变量的问题. function test(x){ eval("var a=x;& ...
- JavaScript中原型链的那些事
引言 在面向对象的语言中继承是非常重要的概念,许多面向对象语言都支持两种继承方式:接口继承和实现继承.接口继承制只继承方法签名,而实现继承继承实际的方法.在ECMAScript中函数没有签名,所以EC ...
- Javascript中关于cookie的那些事儿
Javascript-cookie 什么是cookie? 指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密).简单点来说就是:浏览器缓存. cookie由什 ...
- JavaScript中继承的那些事
引言 JS是一门面向对象的语言,但是在JS中没有引入类的概念,之前特别疑惑在JS中继承的机制到底是怎样的,一直学了JS的继承这块后才恍然大悟,遂记之. 假如现在有一个“人类”的构造函数: functi ...
- (转载)JavaScript中面向对象那点事
鉴于自己在JavaScript这方面比较薄弱,所以就找了一本书恶补了一下(被称为犀利书的JavaScript权威指南).书的内容虽然多了点,但这也充分说明了js中的东西还是挺多的.虽然我们的定位不是前 ...
- JavaScript中面向对象那点事
鉴于自己在JavaScript这方面比較薄弱.所以就找了一本书恶补了一下(被称为犀利书的JavaScript权威指南).书的内容尽管多了点,但这也充分说明了js中的东西还是挺多的.尽管我们的定位不是前 ...
- Javascript中那些你不知道的事之-- false、0、null、undefined和空字符串
话不多说直接进入主题:(如果有写的不对的地方欢迎指正) 我们先来看看他们的类型分别是什么: typeof类型检测结果 结论:false是布尔类型对象,0是数字类型对象,null是object对象,un ...
- JavaScript中的this陷阱的最全收集
JavaScript来自一门健全的语言,所以你可能觉得JavaScript中的this和其他面向对象的语言如java的this一样,是指存储在实例属性中的值.事实并非如此,在JavaScript中,最 ...
随机推荐
- Nuget的使用
前言 最近看到园子上有关于NuGet (读音:new get)的使用,所以心血来潮也跟着学习做了一下,觉得很流b哦.于是也就记一下自己的学习心得(并非一味的重复轮子,只是觉得他人做的写的就是对的,自己 ...
- poj 1274The Perfect Stall
第一次接触二分图匹配. 这题是一个匈牙利算法的模板题直接套即可. 题意是 给你奶牛和谷仓的个数a和b,接下来a行是奶牛喜欢去的谷仓.第一个是谷仓个数,接下来是谷仓编号. 这里我们把行当奶牛,列当谷仓 ...
- 新版本NDK环境结构(避Cygwin,超快)
曾经做Android的项目要用到NDK就必需要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量... 麻烦到不想说 ...
- cocos2dx --- button点击放大中心
自定义简单button,直接附着到代码: MenuItem* MenuItemNode::create( const char* normal,Ref* target,SEL_MenuHandler ...
- Android4.4 蓝牙源代码段分析
最近GOOGLE发布时间Android4.4,我看了看源代码.4.4蓝牙打开过程或这部分的一些变化,判断蓝牙开关是从接口设置settings在里面switch开关,widget当然,它可以切换,也许启 ...
- YouTube图片幻灯片分享技巧
以前,您将使用的Windows Movie Maker或Picasa的工具,如缝合的图像文件转换成视频上传到YouTube.然而,添美的小编分享了她的技巧,你可以创建一个图片直接进入YouTube的视 ...
- extjs_09_定义自己的页面组件
1.项目截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I0J ...
- paip.自适应网页设计 同 响应 与设计的原理的差and实践总结
paip.自适应网页设计 同 响应 与设计的原理的差and实践总结 响应式Web设计(Responsive Web design)的理念是: 1 #-----------自适应布局VS响应式布局 2 ...
- NSIS:迅雷5.8.6.600自由定制版脚本及下载
原文 NSIS:迅雷5.8.6.600自由定制版脚本及下载 虽然现在迅雷已升级到7.2版本,但作为一款下载工具,我们可能只是需要它的下载功能,所以,体积小资源占用也小的迅雷5便成了我们更好的选择.今天 ...
- malloc实现原理
记得早一段时间,看到一本书上写过delete的一个..今天突然找啦一下资料: malloc()是C语言中动态存储管理 的一组标准库函数之中的一个.其作用是在内存的动态存储区中分配一个长度为size的连 ...