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 相关文章推荐
jQuery 使用手册(三)
Sep 23 Javascript
js函数中onmousedown和onclick的区别和联系探讨
May 19 Javascript
swtich/if...else的替代语句
Aug 16 Javascript
JavaScript中this详解
Sep 01 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
Dec 02 Javascript
javascript获取select标签选中的值
Jun 04 Javascript
JS图片放大效果简单实现代码
Sep 08 Javascript
vue2.0开发实践总结之疑难篇
Dec 07 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
Dec 08 Javascript
基于Vue的文字跑马灯组件(npm 组件包)
May 24 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
Dec 27 Javascript
微信小程序如何获取用户信息
Jan 26 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类Class的概念
2012/06/14 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
Python 初始化多维数组代码
2008/09/06 Python
python中的装饰器详解
2015/04/13 Python
Python中用Spark模块的使用教程
2015/04/13 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
python如何实现内容写在图片上
2018/03/23 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
Python面试题集
2012/03/08 面试题
好邻里事迹材料
2014/01/16 职场文书
创新型城市实施方案
2014/03/06 职场文书
《梅花魂》教学反思
2014/04/30 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
2019财务转正述职报告
2019/06/27 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL