基础知识
JavaScript中的类
JavaScript实际上是一种弱类型语言,与C++和Java等语言不同。因此,在JavaScript中,没有强调类(class)这一概念,但实际运用中,类还是很重要的,比如写一款游戏,如果我们不停地调用函数来完成创建角色,移动角色的话,那会是什么样的呢?可能会出现非常多的重复代码,因此我们需要一个类来统一这些代码。所谓的类,就是把程序中的代码分类,比如说游戏中的关于角色的代码算作一类,游戏背景算作一类,游戏特效又是一类。这样一来,我们对类进行操作,就不会使代码显得很凌乱,冗杂。虽然Js是弱类型语言,但是也提供了类这一概率。
定义Js中的类,实际上用的是function
,总所周知,这个语法其实是用来定义函数的。不用于定义函数的是,我们可以在function
中通过this.xxx
的方式来定义属性和方法。比如说:
1 2 3 4 5 6 7 |
function People () { this.name = "Yorhom"; this.getName = function () { return this.name }; } |
使用的时候使用new
:
1 2 3 |
var yorhom = new People(); // "Yorhom" alert(yorhom.getName()); |
可以看到,这样就可以使用到我们定义的类和类中的方法了。
也许你会问this.xxx
只能定义公有属性和方法,那私有属性和方法怎么办呢?这个可以用到js闭包的知识来解决:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function People () { this.name = "Yorhom"; var age = 16; this.getName = function () { return this.name }; this.getAge = function () { return age; }; } var yorhom = new People(); // undefined alert(yorhom.age); // 16 alert(yorhom.getAge()); |
可以看到,这里的age就是一个私有属性了。
JavaScript中的prototype
上面的代码美中不足的地方就是,如果一个类有很多方法,同时用到这个类的地方又有很多(也就是new
出来的对象有很多),那么用上面的代码就会出现内存占用过剩的问题。问题的根本原因在于,每次实例化一个对象,这个类就会执行构造器里的代码(以People类为例就是function People () {…}执行的代码),因此每当这个类被实例化的时候,这些方法和属性就会被拷贝到实例化出来的对象中。这样一来,就会造成“吃”内存的现象。
于是js中的prototype
就诞生了。prototype
的作用通常是给一个类添加一系列常量或者方法。 每当一个类被实例化之后,实例化出来的对象会自动获取类的prototype
中定义的方法和属性。只不过这里的获取类似于C++里面的引用,不会在内存里对这些方法和属性进行复制,而是指向这些方法和属性。示例:
1 2 3 4 5 6 7 8 9 10 11 |
function People () { this.name = "Yorhom"; } People.prototype.getName = function () { return this.name; }; var yorhom = new People(); // "Yorhom" alert(yorhom.getName()); |
这种方法虽然可以节约内存,但是,美中不足的是,无法定义私有属性。
类的继承
Javascript没有提供继承的函数,所以只有自己写了。这里借用lufylegend.js中的继承方法向大家展示如何实现继承: