JS分离构造器
来源:互联网 发布:二叉树的遍历算法代码 编辑:程序博客网 时间:2024/04/29 06:10
通过new操作符构建一个对象,一般经过四步:
A.创建一个新对象
B.将构造函数的作用域赋给新对象(所以this就指向了这个新对象)
C.执行构造函数中的代码
D.返回这个新对象
最后一点就说明了,我们只要返回一个新对象即可。其实new操作符主要是把原型链跟实例的this关联起来,这才是最关键的一点,所以我们如果需要原型链就必须要new操作符来进行处理。否则this则变成window对象了。
我们来剖析下jQuery的这个结构,以下是我们常见的类式写法:
var $$ = ajQuery = function(selector) { this.selector = selector; return this}ajQuery.fn = ajQuery.prototype = { selectorName:function(){ return this.selector; }, constructor: ajQuery}var a = new $$('aaa'); //实例化a.selectorName() //aaa //得到选择器名字
首先改造jQuery无new的格式,我们可以通过instanceof判断this是否为当前实例:
var $$ = ajQuery = function(selector) { if(!(this instanceof ajQuery)){ return new ajQuery(selector); } this.selector = selector; return this}
但是注意千万不要像下面这样写:
var $$ = ajQuery = function(selector) { this.selector = selector; return new ajQuery(selector);}Uncaught RangeError: Maximum call stack size exceeded
这样会无限递归自己,从而造成死循环并且溢出。
jQuery为了避免出现这种死循环的问题,采取的手段是把原型上的一个init方法作为构造器
var $$ = ajQuery = function(selector) { //把原型上的init作为构造器 return new ajQuery.fn.init( selector );}ajQuery.fn = ajQuery.prototype = { name: 'aaron', init: function() { console.log(this) }, constructor: ajQuery}
这样确实解决了循环递归的问题,但是又问题来了,init是ajQuery原型上作为构造器的一个方法,那么其this就不是ajQuery了,所以this就完全引用不到ajQuery的原型了,所以这里通过new把init方法与ajQuery给分离成2个独立的构造器。
内容转自慕课网http://www.imooc.com/code/3398
1 0
- JS分离构造器
- 分离构造器
- jQuery源码分析7--分离构造器
- js构造器
- vue.js基础-构造器
- vue.js基础-构造器
- vue.js基础-构造器
- js行为样式分离
- 分离独立js文件
- jQuery深入之源码解析(四)——分离构造器
- 【javascript笔记】js构造器<六>
- JS-Function 构造器及其对象、方法
- js的原型链与构造器
- js之构造器模式(Constructor)
- js 构造器的调用中的问题
- js 原型、原型链、构造器关系
- JS——Constructor(构造器)模式
- js表现与数据分离
- 那些情况该使用它们spin_lock到spin_lock_irqsave
- BZOJ 4002 JLOI 2015 有意义的字符串 数列
- 【Python 笔记】Python中 swich...case 的实现
- mybaits错误解决:There is no getter for property named 'id' in class 'java.lang.Long'
- bzoj 1002
- JS分离构造器
- 修改debian的时间,pst 修改到cst 北京/上海时区
- 介绍两个ios手机测试的辅助工具
- Swift语言指南--可选值
- DiskCache
- HTML学习笔记<1>
- webp转换脚本
- 例题6-6 UVs679 Dropping Balls(二叉树)
- c++ 多重继承