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 相关文章推荐
在新窗口打开超链接的方法小结
Apr 14 Javascript
javascript的变量、传值、传址、参数之间关系
Jul 26 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
Sep 28 Javascript
node.js实现博客小爬虫的实例代码
Oct 08 Javascript
Angular-Touch库用法示例
Dec 22 Javascript
JavaScript中var、let、const区别浅析
Jun 24 Javascript
Angularjs实现多图片上传预览功能
Jul 18 Javascript
ng-repeat指令在迭代对象时的去重方法
Oct 02 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
Jun 03 Javascript
Vue3 中的数据侦测的实现
Oct 09 Javascript
javascript数组元素删除方法delete和splice解析
Dec 09 Javascript
基于JavaScript实现简单扫雷游戏
Jan 02 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 动态添加记录
2009/03/10 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
Yii使用smsto短信接口的函数demo示例
2016/07/13 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
vue中英文切换实例代码
2020/01/21 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
详解Python中的各种函数的使用
2015/05/24 Python
浅谈Python中函数的参数传递
2016/06/21 Python
简单谈谈python中的Queue与多进程
2016/08/25 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
Django 路由控制的实现
2019/07/17 Python
python list多级排序知识点总结
2019/10/23 Python
python statsmodel的使用
2020/12/21 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
S’well Bottle保温杯官网:绝缘不锈钢水瓶
2018/05/09 全球购物
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
低碳环保倡议书
2014/04/14 职场文书
课外小组活动总结
2014/08/27 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书