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 相关文章推荐
Extjs学习过程中新手容易碰到的低级错误积累
Feb 11 Javascript
你必须知道的Javascript知识点之"单线程事件驱动"的使用
Apr 23 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
Nov 07 Javascript
页面定时刷新(1秒刷新一次)
Nov 22 Javascript
jquery分页插件jpaginate在IE中不兼容问题
Apr 22 Javascript
javascript使用smipleChart实现简单图表
Jan 02 Javascript
JavaScript实现在页面间传值的方法
Apr 07 Javascript
javascript中动态函数用法实例分析
May 14 Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
Jan 04 Javascript
JS实现DOM删除节点操作示例
Apr 04 Javascript
vue-element-admin项目导入和导出的实现
May 21 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
DC动漫人物排行
2020/03/03 欧美动漫
php中的MVC模式运用技巧
2007/05/03 PHP
php md5下16位和32位的实现代码
2008/04/09 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
关于ExtJS4.1:快捷键支持的问题
2013/04/24 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
2017/07/20 Javascript
微信小程序tabBar底部导航中文注解api详解
2017/08/16 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python SQLite3数据库操作类分享
2014/06/10 Python
python算法表示概念扫盲教程
2017/04/13 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
Python matplotlib画图与中文设置操作实例分析
2019/04/23 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
护理职业生涯规划书
2014/01/24 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
教师党员承诺书
2014/03/25 职场文书
社区居务公开实施方案
2014/03/27 职场文书
品质口号大全
2014/06/17 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
八年级英语教学计划
2015/01/23 职场文书
2016教师节感恩话语
2015/12/09 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers