面向对象
Java是支持面向对象编程的语言,java设计思想参考java之父James Gosling的一次谈话 http://www.artima.com/intv/gosling1P.html。设计简单,易于理解,多用于开发Internet
应用软件。90年代的许多软件开发思想得益于Smalltalk语言。
本文试图从多继承、封装、多态、闭包的实现来说明几种语言面向对象编程的特点。包括:不同访问权限,如私有、公有;类属性(静态)与对象属性(只属于每个对象);接口、抽象方法;常量、变量。如果你是某种语言的专家,请指正。
动态语言? |
作用域 |
类与对象 |
JavaScript |
var声明为当前作用域,否则为全局。 静态类型通过语言内置原型prototype字段,隐式支持。包括构造器constructor |
动作方法只支持封装function,json可作为数据类型封装。 ECMA6支持class 规范:接口的实现通过巧妙的编程设计来实现。JS的设计非常简单,可读性和功能很强大 |
Python |
__ 下划线声明为私有字段,否则为共享字段 方法可以定做在类中也可以在类外(文件中)。类外方法可以作为静态方法,另外类方法、接口、抽象方法通过注释实现。 |
class关键字支持。def关键字定义方法。有构造方法和析构方法。以及类似静态构造方法new方法,只执行一次,在所有方法之前执行。 通过人工手段实现规范,非原始支持这些规范。 |
PHP |
已经启用var关键字,通过其它关键字声明作用域,语法类似Java。可读性很强。 变量作用域关键字支持全面 |
class 等支持良好。 |
编译语言? |
||
Go |
以C语言为原型。通过首字母大写为作用域。通过包来区分一组功能,没有类的概念。main方法为程序入口,不同操作系统编译为不同的可执行程序。 |
方法、接口、数据结构(类)等是同一个级别的。在Java中方法属于类,是隶属关系不平等。 新的编程思路的设计语言。非常有趣。 |
Scala |
JVM平台语言,高阶函数支持。语法略显臃肿,或者说这样让面向对象设计的思维负担减轻(这个懒是不能偷)。支持太多,或者说不是好事。 |
class有一个伴生对象用Object关键字声明(单例设计)。可直接声明函数,函数不同于方法,方法定义类或者伴生对象中。伴生对象即静态支持。 |
Java |
通过关键字声明作用域,static为所有对象共享。可读性非常好。规范性强,需要较多的设计技巧,良好支持企业级多团队开发。 |
C语言系列语言。 |
Javascript
关于闭包,最简单的描述就是 ECMAScript 允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。————百度百科。
本文没有使用ECMAScript 6的新特性。如class与extends。
对于JS面向对象的详细了解,请点击这里。
在文件中声明作用空间,类似java中的package。目的是区分
类模板,复用此类模板
在任意一个*.html文件中测试,直接用浏览器打开即可。
注释掉上面的测试数据,上面的属性为对象私有。下面介绍类属属性。对象共享类似静态属性、静态方法在javascript中的设计。JS中属性可以动态按需增加或删除。var声明变量为当前作用域类似private,但不是访问限制。不加代表全局作用域。
这里的原型只能通过类(即方法名).prototype来使用。
继承
在Person中加入原型属性,保持父类原型非空有意义。
-
子类原型保存父类模板以及原型,但用父类构造方法且保存了值。这适用某些情况。
-
模板继承,解决了上面继承值问题。但不继承原型。
Teacher类继承Person类
ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递给函数的值,call与apply的不同就是call传的值可以是任意的,而apply传的剩余值必须为数组。
-
把继承抽象成工具方法,继承原型而不影响父类。但仍需要子类绑定模板。