Javascript的无new构建实例详解


Posted in Javascript onMay 15, 2016

看jquery源代码第一步的时候,对于jquery对象的创建就看的云里雾里,琢磨半天终于有点感觉了,在此记录下

第一种方式:

var A = function(){
return A.prototype.init();
}
A.prototype = {
init:function(){
this.age = 50;
console.log(this);
return this;
},
age:100
}
console.log(A() === new A());

Javascript的无new构建实例详解

1.分析下结果为什么为true

A()内部调用的是A.prototype.init()函数

new A() 内部会调用构造函数,而它的构造函数就是function(){return A.prototype.init();},同样调用的是A.prototype.init()函数

2.分析下A.prototype.init()函数返回什么

那就要看this了,判断this指向谁,我们要在函数调用的时候分析,由于它是作为原型对象的属性调用的,所以this就是原型对象A.prototype

这种创建方式,无论你调用多少次A(),他们其实都是返回的同一个对象,所以对b对象的修改会影响a对象,见下图

var a = A();
var b = A();
console.log(a.age);
console.log(b.age);
b.age = 22;
console.log(a.age);
console.log(b.age);

Javascript的无new构建实例详解

那么如何解决这种问题呢,接下来就讲下第二种方式,它也是jquery采用的方式

第二种方式

var A = function(){
return new A.prototype.init();//①
}
A.prototype = {
init:function(){
this.age = 50;
console.log(this);
return this;
},
age:100
}
A.prototype.init.prototype = A.prototype;//②
var a = new A();
var b = new A();
console.log(a===b);
console.log(a.age);
console.log(b.age);
b.age = 22;
console.log(a.age);
console.log(b.age);

Javascript的无new构建实例详解

分析下①和②

①中new A.prototype.init()主要做了三件事

创建一个空对象var obj = {};

obj对象属性_proto_指向函数A.prototype.init的prototype;

将A.prototype.init函数的this替换成obj对象,在调用A.prototype.init函数,A.prototype.init.call(obj),并返回新对象

因为①返回的对象的原型是A.prototype.init.prototype,它和A.prototype并没什么关系,为了使新返回的对象可以继承自A.prototype,所以②让A.prototype.init.prototype指向A.prototype

所以方式二即创建了实例,又保证了各自的作用域独立。

以上所述是小编给大家介绍的Javascript的无new构建实例详解,希望对大家以上帮助,如果大家想了解更多资讯,敬请关注三水点靠木网站!

Javascript 相关文章推荐
让FireFox支持innerText的实现代码
Dec 01 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
Feb 06 Javascript
JQuery的AJAX实现文件下载的小例子
May 15 Javascript
node.js中的fs.unlinkSync方法使用说明
Dec 15 Javascript
javascript事件冒泡简单示例
Jun 20 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
Oct 14 Javascript
微信小程序 MINA文件结构
Oct 17 Javascript
webpack实现热更新(实施同步刷新)
Jul 28 Javascript
通过 JS 判断页面是否有滚动条的实现方法
Apr 05 Javascript
JS函数内部属性之arguments和this实例解析
Oct 07 Javascript
VUE实现强制渲染,强制更新
Oct 29 Javascript
微信小程序实现菜单左右联动
May 19 Javascript
Javascript基础知识盲点总结之函数
May 15 #Javascript
深入理解$.each和$(selector).each
May 15 #Javascript
js中最容易被忽视的事件问题大总结
May 15 #Javascript
jquery点击改变class并toggle的实现代码
May 15 #Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
May 15 #Javascript
浅析js绑定事件的常用方法
May 15 #Javascript
js添加事件的通用方法推荐
May 15 #Javascript
You might like
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
php 判断数组是几维数组
2013/03/20 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
详谈js原型继承的一些问题
2017/09/06 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
[01:05:59]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
Python算术运算符实例详解
2017/05/31 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
物理系毕业生自荐信
2013/11/01 职场文书
交通法规咨询中心工作职责
2013/11/27 职场文书
代理人委托书
2014/09/16 职场文书
《游戏公平》教学反思
2016/02/20 职场文书