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 相关文章推荐
20个非常棒的 jQuery 幻灯片插件和教程分享
Aug 23 Javascript
原生JavaScript实现合并多个数组示例
Sep 21 Javascript
JavaScript对象之深度克隆介绍
Dec 08 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
Jun 10 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
Sep 27 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 Javascript
求js数组的最大值和最小值的四种方法
Mar 03 Javascript
微信小程序实现红包雨功能
Jul 11 Javascript
详解小程序之简单登录注册表单验证
May 13 Javascript
vue中动态select的使用方法示例
Oct 28 Javascript
小程序表单认证布局及验证详解
Jun 19 Javascript
javascript实现放大镜功能
Dec 09 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
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
PHP SOCKET编程详解
2015/05/22 PHP
php简单smarty入门程序实例
2015/06/11 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
优质的学校老师推荐信
2013/10/28 职场文书
《长相思》听课反思
2014/04/10 职场文书
《诚实与信任》教学反思
2014/04/10 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
社区科普工作方案
2014/06/03 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
检察院起诉书
2015/05/20 职场文书
安全生产培训心得体会
2016/01/18 职场文书
一年级下册数学教学反思
2016/02/16 职场文书