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 相关文章推荐
asp.net HttpHandler实现图片防盗链
Nov 09 Javascript
js换图片效果可进行定时操作
Jun 09 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
Nov 30 Javascript
jQuery实现的导航下拉菜单效果示例
Sep 05 Javascript
jQuery命名空间与闭包用法示例
Jan 12 Javascript
关于Javascript中document.cookie的使用
Mar 08 Javascript
jQuery编写textarea输入字数限制代码
Mar 23 jQuery
vue实现日历备忘录功能
Sep 24 Javascript
原生js实现日历效果
Mar 02 Javascript
谈谈JavaScript令人迷惑的==与+
Aug 31 Javascript
详解如何解决使用JSON.stringify时遇到的循环引用问题
Mar 23 Javascript
Node实现搜索框进行模糊查询
Jun 28 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
php批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
基于JQuery实现鼠标点击文本框显示隐藏提示文本
2012/02/23 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
vue实现文件上传功能
2018/08/13 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
Foreo国际站:Foreo International
2018/10/29 全球购物
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
汽车队司机先进事迹材料
2014/02/01 职场文书
施工安全协议书范本
2014/09/26 职场文书
导游词之崇武古城
2019/10/07 职场文书