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 IE 浏览器判定代码
Mar 21 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
Jun 22 Javascript
js的延迟执行问题分析
Jun 23 Javascript
javascript中2个感叹号的用法实例详解
Sep 04 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
Dec 12 Javascript
AngularJS教程之MVC体系结构详解
Aug 16 Javascript
JQuery实现DIV其他动画效果的简单实例
Sep 18 Javascript
JS公共小方法之判断对象是否为domElement的实例
Nov 25 Javascript
基于jQuery实现滚动刷新效果
Jan 09 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
Apr 26 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
Aug 10 Javascript
详解Vue This$Store总结
Dec 17 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
一个分页的论坛
2006/10/09 PHP
php max_execution_time执行时间问题
2011/07/17 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
详解angular element()方法使用
2017/04/08 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
Vue自定义全局弹窗组件操作
2020/08/11 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
python实现中文输出的两种方法
2015/05/09 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
详解python中list的使用
2019/03/15 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
乐观大学生的自我评价
2014/01/10 职场文书
工程招投标邀请书
2014/01/30 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
会计系毕业生求职信
2014/05/28 职场文书
校园元旦活动总结
2014/07/09 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
出售房屋协议书范本
2014/10/06 职场文书
大学生见习报告总结
2014/11/04 职场文书
会计专业自荐信范文
2019/05/22 职场文书