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 相关文章推荐
Add a Picture to a Microsoft Word Document
Jun 15 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
Oct 09 Javascript
可自己添加html的伪弹出框实现代码
Sep 08 Javascript
Javascript倒计时页面跳转实例小结
Sep 11 Javascript
JSON格式化输出
Nov 10 Javascript
搞定immutable.js详细说明
May 02 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
Jun 24 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
Nov 07 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
Mar 29 Javascript
详解Nuxt.js部署及踩过的坑
Aug 07 Javascript
p5.js临摹动态图形的方法
Oct 23 Javascript
jQuery操作元素追加内容示例
Jan 10 jQuery
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
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
Ajax PHP分页演示
2007/01/02 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
详解js常用分割取字符串的方法
2019/05/15 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
Python中关于字符串对象的一些基础知识
2015/04/08 Python
基python实现多线程网页爬虫
2015/09/06 Python
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
DELPHI面试题研发笔试试卷
2015/11/08 面试题
儿科护士自我鉴定
2013/10/14 职场文书
暑期实践个人总结
2015/03/06 职场文书
电影开国大典观后感
2015/06/04 职场文书
小时代观后感
2015/06/10 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python
Python实现视频中添加音频工具详解
2021/12/06 Python