JavaScript基础 面向对象
时间:2010-09-29 来源:2012
参考:http://bbs.51js.com/thread-74195-1-1.html
构造器
构造器代码必须放在整个类定义的最后,这样做是为了保证在它当中被调用的方法都已经被定义了。
私有实例成员[变量和方法]
私有实例成员在 JavaScript 中实际上可以用函数内的局部变量来实现,它相当于类的私有实例成员
他们只能在该类的对象内部被使用,在对象外无法使用。
创建私有方法有两种方式,一种是直接在类中定义方法,另一种是先定义一个局部变量(私有实例字段),然后定义一个匿名方法赋值给它。
公有实例成员:两种方法,prototype 和this定义
1、prototype 方式只应该在类外定义。this 方式只能在类中定义。
2、prototype 方式如果在类中定义时,则存取私有实例成员时,总是存取最后一个对象实例中的私有实例成员。
3、prototype 方式定义的公有实例成员是创建在类的原型之上的成员。this 方式定义的公有实例成员,是直接创建在类的实例对象上的成员。
基于前两点区别,我们可以得到这样的结论:如果要在公有实例方法中存取私有实例成员,那么必须用 this 方式定义。
关于第三点区别,我们后面在讨论继承时再对它进行更深入的剖析。这里只要知道有这个区别就可以了。
不要把通过 prototype 方式创建的公有实例方法定义在类的内部!
公有静态成员
定义的方式就是给 className.memberName 直接赋值。
一定不要将公有静态成员定义在它所在的类的内部
静态类
myClass = new function() {...}
继承:一种是原型继承法,一种是调用继承法
[原型继承法]
子类继承来的公有实例方法中,如果调用了私有实例字段或者私有实例方法,则所调用的这些私有实例成员是属于父类的。
子类中定义的实例方法,如果调用了私有实例字段或者私有实例方法,则所调用的这些私有实例成员是属于子类的。
定义在父类原型上的方法,会被子类继承。
子类中定义的实例方法是不能访问父类中定义的私有实例成员的。
静态成员是不会被继承的。
[调用继承法]
定义在父类原型上的方法,不会被子类继承。
子类中定义的实例方法同样不能访问父类中定义的私有实例成员的。
静态成员同样不会被继承的。
是通过调用继承法,可以实现多继承。也就是说,一个子类可以从多个父类中继承通过 this 方式定义在父类内部的所有公有实例成员。
function subClass() {
// inherit
parentClass.call(this);
方法重载示例
function parentClass() {
this.method = function() {
alert("parentClass method");
}
}
function subClass() {
var method = this.method;
this.method = function() {
method.call(this);
alert("subClass method");
}
}
subClass.prototype = new parentClass();
subClass.prototype.constructor = subClass;
var o = new subClass();
o.method();