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 相关文章推荐
javascript mouseover、mouseout停止事件冒泡的解决方案
Apr 07 Javascript
JavaScript 事件记录使用说明
Oct 20 Javascript
javascript parseInt与Number函数的区别
Jan 21 Javascript
javascript实用小函数使用介绍
Nov 11 Javascript
jquery slibings选取同级其他元素的实现代码
Nov 15 Javascript
Javascript调用函数方法的几种方式介绍
Mar 20 Javascript
值得分享的Bootstrap Table使用教程
Nov 23 Javascript
jquery实现折叠菜单效果【推荐】
Mar 08 Javascript
超简单的微信小程序轮播图
Nov 22 Javascript
JavaScript异步操作的几种常见处理方法实例总结
May 11 Javascript
一起来了解一下JavaScript的预编译(小结)
Mar 01 Javascript
vue完美实现el-table列宽自适应
May 08 Vue.js
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
php5中类的学习
2008/03/28 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
2018/01/08 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
Angular使用动态加载组件方法实现Dialog的示例
2018/05/11 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
详解python单例模式与metaclass
2016/01/15 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
Django组件content-type使用方法详解
2019/07/19 Python
Django Rest framework权限的详细用法
2019/07/25 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
python 监控logcat关键字功能
2020/09/04 Python
python 实现超级玛丽游戏
2020/11/25 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
电子技术专业中专生的自我评价
2013/12/17 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
工厂标语大全
2014/10/06 职场文书
运动会广播稿20字
2015/08/19 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript