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现实多行信息
Aug 26 Javascript
复制本贴标题和地址的js代码
Jul 01 Javascript
保证JavaScript和Asp、Php等后端程序间传值编码统一
Apr 17 Javascript
javascript实现颜色渐变的方法
Oct 30 Javascript
JavaScript数字和字符串转换示例
Mar 26 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
Sep 24 Javascript
详解JavaScript的回调函数
Nov 20 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
Jun 29 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
老生常谈js-react组件生命周期
May 02 Javascript
使用JS实现导航切换时高亮显示的示例讲解
Aug 22 Javascript
JS监听滚动和id自动定位滚动
Dec 18 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
PHP4实际应用经验篇(9)
2006/10/09 PHP
深入PHP异步执行的详解
2013/06/03 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
PHP chr()函数讲解
2019/02/11 PHP
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
python mysqldb连接数据库
2009/03/16 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
Django中Model的使用方法教程
2018/03/07 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
2019/12/10 Python
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
服装设计师求职信
2014/06/04 职场文书
军训口号
2014/06/13 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
学年个人总结范文
2015/03/05 职场文书
求职简历自我评价2015
2015/03/10 职场文书
银行岗位培训心得体会
2016/01/09 职场文书