google closure--继承模块一:goog.inherits()
最近在项目是使用了google closure框架,深入研究了一下源码,先从最简单的继承系统吧。
废话不多说,closure继承模块主要有2个API:
goog.inherits(childCtor,parentCtor);
goog.base(me,opt_methodName,var_args);
先看一下,goog.inherits的源码
goog.inherits = function(childCtor, parentCtor) {
function tempCtor() {};
tempCtor.prototype = parentCtor.prototype;
childCtor.superClass_ = parentCtor.prototype;//给子构造函数添加superClass_属性,指向父构造函数的原型对象
childCtor.prototype = new tempCtor();
childCtor.prototype.constructor = childCtor;
childCtor.base = function(me, methodName, var_args) {//子构造函数绑定base方法,调用父构造函数原型对象方法
// Copying using loop to avoid deop due to passing arguments object to
// function. This is faster in many JS engines as of late 2014.
var args = new Array(arguments.length - 2);
for (var i = 2; i < arguments.length; i++) {
args[i - 2] = arguments[i];
}
return parentCtor.prototype[methodName].apply(me, args);
};
};
代码中有一个小技巧,就是采用利用一个空构造函数,使子构造函数的原型对象只继承父构造函数的原型对象,构造函数内部创建时将不绑定,目的很明确,通过原型链只继承父构造函数的原型对象。

这里还有2个值得注意的地方,一个是:childCtor.superClass_ = parentCtor.prototype,这个相当于在子构造函数上加一个指针superClass_指向父构造函数的原型,这个有什么作用呢?先不用着急,到后面自会揭晓。
第二个指的注意的地方是,为子构造函数添加了一个名为base的方法(不要忘记函数是一等对象哦),可以通过childCtor.base(me,method,arg),me是子构造函数的实例对象,method是想要调取父构造函数原型对象的方法名,arg是传入的参数,这个
有点像通过子构造函数提供函数式调用父构造函数原型对象的方法。
总结一下:
通过goog.inherits()完成了:
1."干净"的继承父构造函数的原型对象.
2."武装“了子构造函数,可以通过childCtor的base方法和所需方法名调用父构造函数原型对象的方法。
3.为子构造函数新加了一个属性,指向父构造函数的原型对象。
疑问:在阅读代码的时候,一定会产生这样的疑问,已经可以通过子构造函数的base访问到父构造函数的相应方法,为什么还要为自构造函数添加一个superClass_的属性指向父构造函数的原型对象呢?不是多次一举了吗?
下一章将揭晓,别忘了还有一个goog.base()呢。
看了这么多有木有同情父构造函数呢,父亲奋斗了那么多年好不容易有了个prototype的小金库,却被儿子无情的压榨,儿子已经享有继承使用权了,还要自己已经有了个小金库弄了个base的钥匙直接用父亲的小金库。。。。。。
可怜天下父母心啊,可是有没有想过,假如父亲不准备为自己创建一个实例,这个prototype小金库有啥用呢,还不如给儿子用。。。。。给孙子用。。。。。
有木有突然恍然大悟,原来千辛万苦,只为一个实例。其实我猜想这段代码的作者的想法是,通过这个简单的api完成,多个构造函数构建一个“超级实例”的想法,可是有什么用处呢~请见下回分晓
google closure--继承模块一:goog.inherits()的更多相关文章
- google closure继承模块三:goog.base()源码分析
直接看代码吧: base: function (me, opt_methodName, var_args) { var caller = arguments.callee.caller; if (ca ...
- google closure--继承模块二:goog.base()demo分析
昨天已经讲到了goog.inherits(),主要负责通过为子构造函数原型对象通过原型链继承父构造函数的原型对象的方法,完成继承.这样继承只完成了原型对象的继承,看看之前的那张图: 是不是感觉父构造函 ...
- Google Closure Compiler 高级模式及更多思考(转)
前言 Google Closure Compiler 是 Google Closure Tools 的一员,在 2009 年底被 Google 释出,早先,有 玉伯 的 Closure Compile ...
- First Adventures in Google Closure -摘自网络
Contents Introduction Background Hello Closure World Dependency Management Making an AJAX call with ...
- 主流JavaScript框架(Dojo、Google Closure、jQuery、Prototype、Mootools和YUI)的分析和对比
本文主要选取了目前比较流行的JavaScript框架Dojo.Google Closure.jQuery.Prototype.Mootools和YUI进行对比,主要是根据网上的资料整理而成,希望可以供 ...
- 使用Google Closure Compiler高级压缩Javascript代码注意的几个地方
介绍 GCC(Google Closure Compiler)是由谷歌发布的Js代码压缩编译工具.它可以做到分析Js的代码,移除不需要的代码(dead code),并且去重写它,最后再进行压缩. 三种 ...
- Google Closure Compiler高级压缩混淆Javascript代码
一.背景 前端开发中,特别是移动端,Javascript代码压缩已经成为上线必备条件. 如今主流的Js代码压缩工具主要有: 1)Uglify http://lisperator.net/uglifyj ...
- JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
网上搜索了,目前主流的Js代码压缩工具主要有Uglify.YUI Compressor.Google Closure Compiler,简单试用了UglifyJS 和Google Closure Co ...
- 使用Google Closure Compiler全力压缩代码(转)
JavaScript压缩代码的重要性不言而喻,如今的压缩工具也有不少,例如YUI Compressor,Google Closure Compiler,以及现在比较红火的UglifyJS.Uglify ...
随机推荐
- 急训 Day 1 (2)
Mushroom的区间[题目描述]Mushroom有一行数,初始时全部是0.现在Mushroom有m个区间[L,R],他希望用以下操作得到新的序列.从m个给定区间中选择一个区间[s,t],把区间中的数 ...
- iOS - Push 通知推送
1.UserNotifications 通知是 App 用来和用户交流的一种方式,特别是当 App 并没有在前台运行的时候.通知,正如它的名称所强调的,被用作向用户'通知'一个事件,或者仅仅向用户提示 ...
- MFC编程入门之二十五(常用控件:组合框控件ComboBox)
上一节讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常见,例如,在Windows系统的控制面板上设置语言或位置时,有很多选项,用来进行选择的控件就是组合框 ...
- js加密解密
<script> document.write("<xmp>"); document.write(function(p,a,c,k,e,r){}(''.sp ...
- 24. Swap Nodes in Pairs
24. Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For ...
- 使用Asp.Net Core Identity给用户添加及删除角色
基于Asp.Net Core编制一个项目,需要给用户添加及删除角色的功能,于是使用到了Identity中的UserManager. 先后解决了几个问题,终于实现了设想. 1. 环境条件 Asp.Net ...
- 更改make/bison的版本
一.make版本 1.下载make的压缩包 ftp://ftp.gnu.org/gnu/make/ 2.解压,安装 cd make-x.x ./configuration sh build.sh su ...
- hadoop安装及配置入门篇
声明: author: 龚细军 时间: -- 类型: 笔记 转载时请注明出处及相应链接. 链接地址: http://www.cnblogs.com/gongxijun/p/5726024.html 本 ...
- 简单的验证码识别(opecv)
opencv版本: 3.0.0 处理验证码: 纯数字验证码 (颜色不同,有噪音,和带有较多的划痕) 测试时间 : 一天+一晚 效果: 比较挫,可能是由于测试的图片是在太小了的缘故. 原理: 验证码 ...
- JavaScript判断IE版本
判断IE兼容到IE11 IE浏览器与非IE浏览器的区别是IE浏览器支持ActiveXObject,但是非IE浏览器不支持ActiveXObject.在IE11浏览器还没出现的时候我们判断IE和非IE经 ...