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完成,多个构造函数构建一个“超级实例”的想法,可是有什么用处呢~请见下回分晓

时间: 2024-08-14 23:18:16

google closure--继承模块一:goog.inherits()的相关文章

google closure--继承模块二:goog.base()demo分析

昨天已经讲到了goog.inherits(),主要负责通过为子构造函数原型对象通过原型链继承父构造函数的原型对象的方法,完成继承.这样继承只完成了原型对象的继承,看看之前的那张图: 是不是感觉父构造函数好像没什么用处啊,还记得上篇文章,构建一个超级对象的设想吗?这个要依赖另一个API,goog.base(). 在看源代码之前让我们看看一个简单的demo,温习一下goog.inherit(),这个demo还可以帮助我们了解goog.base()可以做些什么. demo代码: 输出结果: 分析: 先

使用Google Closure Compiler高级压缩Javascript代码注意的几个地方

介绍 GCC(Google Closure Compiler)是由谷歌发布的Js代码压缩编译工具.它可以做到分析Js的代码,移除不需要的代码(dead code),并且去重写它,最后再进行压缩. 三种压缩模式 GCC提供三种压缩模式: 1)Whitespace only 2)Simple 3)Advanced 我们以这段简单的代码为例 function sayHello(name) { alert('Hello, ' + name); } sayHello('binnng'); 分别使用这三种压

使用Google Closure Compiler全力压缩代码(转)

JavaScript压缩代码的重要性不言而喻,如今的压缩工具也有不少,例如YUI Compressor,Google Closure Compiler,以及现在比较红火的UglifyJS.UglifyJS的出名是由于它代替Closure Compiler成为jQuery项目的压缩工具.根据我的实测,jQuery Core的代码使用UglifyJS压缩后(节省62.5%)的确要比Closure Compiler压缩后(节省57.53%)更小一些.很显然,这是因为UglifyJS的压缩策略比Clos

google closure 笔记-SOY template

一 使用js模板 closure template 目前支持Java和js.但是模板语法的设计不依赖于任何现成的语言,所以理论上可以支持任何语言,只是暂时只有java编译器. 使用js模板:编写模板文件 .soy文件,然后用一个java编写的编译器将其编译为js文件,这个编译好的js文件会提供一个函数来输出模板内容, 只需要引入这个js文件然后在js中调用这个函数就可以得到模板的内容(内容是一个字符串). 1, 下载工具包 http://closure-templates.googlecode.

bootstrap-datetimepicker在经过GC(Google Closure Compiler)压缩后无法使用的解决方案

将压缩级别由simple改成whitespace 问题就是这样之后压缩后的文件大了很多 <?xml version="1.0"?> <project name="Javascript compress project" basedir="." default="compile"> <taskdef name="jscomp" classname="com.google

Google JavaScript规范

前言 此文档为翻译google的标准javascript规范 请与以下原文对照阅读 有异议的地方以原文为准 原文地址google javascript规范 http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml 文中推荐使用的工具是google推荐使用的,请根据实际情况选用 文中定义的很多格式主要是为了考虑js文件编译(js最小化)的问题,如果在项目中考虑使用 js文件编译 请尽量遵守 此文档不仅仅是一份编码风格

Google JavaScript Style Guide

转自:http://google.github.io/styleguide/javascriptguide.xml Google JavaScript Style Guide Revision 2.93 Aaron Whyte Bob Jervis Dan Pupius Erik Arvidsson Fritz Schneider Robby Walker Each style point has a summary for which additional information is ava

转---Google Python编程风格指南

为帮助读者能够将代码准确格式化,我们提供了针对 Vim的配置文件 .对于Emacs用户,保持默认设置即可. 背景 Python 是 Google主要的脚本语言.这本风格指南主要包含的是针对python的编程准则. 为帮助读者能够将代码准确格式化,我们提供了针对 Vim的配置文件 .对于Emacs用户,保持默认设置即可. Python语言规范 Lint 对你的代码运行pylint 定义: pylint是一个在Python源代码中查找bug的工具. 对于C和C++这样的不那么动态的(译者注: 原文是

seajs模块压缩问题

在优化整理项目代码时,想使用seajs来把代码模块化.看了下官方5分钟上手教程,觉得很不错,也没多想就一直开发下去了,也没出什么问题.等一同事说把代码打包个放到设备上去测试一下,发现怎么也跑不起来,郁闷了. 于是单步调试一把,发现模块一直加不进来.看了一下seajs的原码,明白了是怎么回事. define模块解析依赖有两种途径,一种是从define(id, deps, factory)中的deps来:还有一种是解析define代码,从require中来.来看一下代码: 1 Module.defi