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 tab标签页的制作
May 10 Javascript
javascript类型转换使用方法
Feb 08 Javascript
Vue.js动态组件解析
Sep 09 Javascript
jQuery实现两列等高并自适应高度
Dec 22 Javascript
走进javascript——不起眼的基础,值和分号
Feb 24 Javascript
Vue.js实战之Vuex的入门教程
Apr 01 Javascript
React复制到剪贴板的示例代码
Aug 22 Javascript
vue使用xe-utils函数库的具体方法
Mar 06 Javascript
vue使用laydate时间插件的方法
Nov 14 Javascript
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 Javascript
JavaScript 数组去重详解
Sep 15 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 存取 MySQL 数据库的一个例子
2006/10/09 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
php中namespace use用法实例分析
2016/01/22 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
PHP xpath()函数讲解
2019/02/11 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
Javascript 读后台cookie代码
2008/09/15 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
VueJs与ReactJS和AngularJS的异同点
2016/12/12 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
jQuery实现导航回弹效果
2017/02/27 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
详解微信小程序开发(项目从零开始)
2019/06/06 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python numpy实现rolling滚动案例
2020/06/08 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
求职导师推荐信范文
2015/03/27 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
JAVA API 实用类 String详解
2021/10/05 Java/Android