向模块化进军,创建类

在讲解MVC 的本质之前,我们首先给大家补习一下基础知识,比如JavaScript 的类和事件。只有打下一个坚实的基础,才能更好地学习、理解更高级的概念。

对于静态的类来说,JavaScript对象直接量就已经够用了,但它对使用继承和实例来创建经典的类往往更有帮助。有必要强调一下:JavaScript 是基于原型的编程语言,并没有包含内置类的实现。但通过JavaScript 可以轻易地模拟出经典的类。

JavaScript 中的类口碑并不太好,因为“不够JavaScript”而饱受批评。jQuery 并没有涉及太多架构方法和继承模式,这让JavaScript 开发者确信自己不必考虑太多架构性的东西,甚至觉得类的用处不大或干脆禁用类。实际上,类是另一种有用的工具,作为一名实用主义者,我相信类在JavaScript 中的重要性丝毫不亚于它在其他现代编程语言中的重要性。

JavaScript 中并没有真正的类,但JavaScript 中有构造函数和new 运算符。构造函数用来给实例对象初始化属性和值。任何JavaScript 函数都可以用做构造函数,构造函数必须使用new 运算符作为前缀来创建新的实例。

new 运算符改变了函数的执行上下文,同时改变了return 语句的行为。实际上,使用new和构造函数很类似于传统的实现了类的语言:

var Person = function(name) {

this.name = name;

};

// 实例化一个Person

var alice = new Person('alice');

// 检查这个实例

assert( alice instanceof Person );

构造函数的命名通常使用驼峰命名法,首字母大写,以此和普通的函数区分开来,这是一种习惯用法。记住这一点非常重要,因为你不会希望用省略new 前缀的方式来调用构造函数。

// 不要这么做!

Person('bob'); //=> undefined

这个函数只会返回undefined,并且执行上下文是window(全局)对象,你无意间创建了一个全局变量name。调用构造函数时不要丢掉new 关键字。

当使用new 关键字来调用构造函数时,执行上下文从全局对象(window)变成一个空的上下文,这个上下文代表了新生成的实例。因此,this 关键字指向当前创建的实例。尽管理解起来有些绕,实际上其他语言内置类机制的实现也是如此。

默认情况下,如果你的构造函数中没有返回任何内容,就会返回this——当前的上下文。要不然就返回任意非原始类型的值。比如,我们可以返回一个用以新建一个新类的函数,第一步要做的是创建自己的类模拟库:

var Class = function(){

var klass = function(){

this.init.apply(this, arguments);

};

klass.prototype.init = function(){};

return klass;

};

var Person = new Class;

Person.prototype.init = function(){

// 基于Person 的实例做初始化

};

// 用法:

var person = new Person;

令人费解的是,由于JavaScript 2(http://www.mozilla.org/js/language/js20-1999-02-18/

classes.html)规范从未被实现过,class 一直都是保留字。最常见的做法是将变量名class 改为_class 或klass。

本文节选自《基于MVC的JavaScript Web富应用开发》一书

(美)麦卡劳(MacCaw,A.)著

李晶,张散集译

图书详细信息:http://blog.csdn.net/broadview2006/article/details/7623829

本书教你如何构建先进的富应用程序,书中给出的很多优秀的工具和最佳实践都是很多程序员和工程师在工作中亟需的。

向模块化进军,创建类相关推荐

  1. 关于python创建类的深入理解

    背景 我们知道在python中一切皆为对象的概念,那我们们来看一段程序 class Foo(object):def __init__(self, name):self.name = namef = F ...

  2. Python 创建类的成员并访问

    类的成员: python 中类的成员是有实例方法和数据成员组成 1 创建实例方法并访问 创建实例方法,就是创类类的时候实例化方法,具体的如下 class People:def __init__(sel ...

  3. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

  4. python type创建类_Python基于内置函数type创建新类型

    英文文档: class type(object) class type(name, bases, dict) With one argument, return the type of an obje ...

  5. C# 反射 通过类名创建类实例

    "反射"其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用 ...

  6. python动态创建类_Python中通过参数动态创建扩展类(class)

    class Bar: def super_cool_function(self): print("Cool") 1.利用Python闭包动态扩展类 通过在内部创建并从函数返回它来动 ...

  7. 如何在电脑上创建python_python怎么创建类Python中的除法

    在C/C++语言对于整形数执行除法会进行地板除(舍去小数部分).例如 int a=15/10; a的结果为1. 同样的在Java中也是如此,所以两个int型的数据相除需要返回一个浮点型数据的时候就需要 ...

  8. 单例模式(全局地提供了一个类的唯一对象,该类的对象只创建一次,避免了创建类对象的开销)

    单例模式全局地提供了一个类的唯一对象,而且类的对象只需要创建一次,避免了创建类的对象开销 代码 single.h #ifndef HEADFILE #define HEADFILE#include & ...

  9. eclipse中创建类和包的快捷方式

    总是右键创建类很累啊,得用快捷方式,提高生产力啊. 分别为创建包和类的快捷按钮. 没有,怎么显示,如下: 转载于:https://www.cnblogs.com/wisdomzhang/p/10314 ...

  10. python3 动态创建类对象并调用函数

    1. 首先import相关模块`import importlib` 2. 加载你想要加载的模块`model = importlib.import_module(模块名称)` 3. 获取类对象`api_ ...

最新文章

  1. MindArmour差分隐私
  2. 网站品牌词指数提升的四大方法
  3. ES5-9 【utils】构造函数及实例化原理、包装类
  4. toj 3616 Add number (没想到啊~~)
  5. java中对象清空值_对象的引用和清除_Java语言程
  6. Java基础与数据库对应数据--Java基础2阶段
  7. python fortran混合编程_python调用fortran模块
  8. 华为鸿蒙平板界面,华为工作人员曝光:鸿蒙OS正式版,平板手机将采用全新UI界面...
  9. The only difference is that they are written
  10. linux 改路由表 宕机,网管宕机,服务停止?别担心,解决方案来了
  11. 【C++】 53_被遗弃的多重继承 (上)
  12. C++中result_of用法
  13. python贪心算法几个经典例子_python 贪心算法的实现
  14. 黑马程序员--多线程
  15. 使用UDP遇到的问题小结
  16. QoS(Quality of Service),中文名为服务质量。
  17. 电脑qq传到我的android文件在哪里,怎么找到已经发送到手机微信和QQ上的资料保存文件夹(安卓)...
  18. 软件企业研发人员激励机制研究
  19. Acwing 1227. 分巧克力
  20. Python seaborn 条形图

热门文章

  1. POJ 2289 Jamie's Contact Groups 【二分】+【多重匹配】(模板题)
  2. 左连接与右连接的区别
  3. 100万个不重复的8位的随机数
  4. jQuery中浏览器版本判断的一个BUG,此BUG已影响到jqModal,thickbox等多个jQuery插件的应用...
  5. Windows环境下32位汇编语言程序设计笔记-基础篇
  6. centos7 安装python3.6 及模块安装演示
  7. POJ 3669 简单BFS
  8. soa---java 多线程的---锁
  9. PAM for Kmedoids algorithm, PAM算法的实现, kmeans 算法实现. 利用scikit-learn toolbox.
  10. 本博已停用,现在的博客是www.mutousay.com