真正的面向对象语言必须支持继承机制,即一个类能够重用(继承)另一个类的方法和属性.javascript既然是面向对象语言,那么就能支持这种继承关系。下面就引入继承机制.
要用ECMAScript实现继承机制,着先从基类入手.所有开发者定义的类都可以作为基类。出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为这些代码可以被用于恶意攻击.
因为javascrip中的继承机制并不是明确规定的,而是通过模仿实现的 ,所以你有权决定使用自己最适用的继承方式.
第一种方式: 对象冒充
其原理就是:构造函数使用this关键字给所有属性和方法赋值(即采用类声明的构造函数方式)。因为构造函数只是一个函数,所以可使ClassA的构造函数成为ClassB的方法然后调用它.ClassB就会收到ClassA的构造函数中定义的属性和方法.(从而实现继承的功效)
对象冒充方式的继承机制更强的一点就是可以支持多重继承(一个类可以继承多个超类)。实现的方法与继承一个类同样的.
如上例可写成:
要用ECMAScript实现继承机制,着先从基类入手.所有开发者定义的类都可以作为基类。出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为这些代码可以被用于恶意攻击.
因为javascrip中的继承机制并不是明确规定的,而是通过模仿实现的 ,所以你有权决定使用自己最适用的继承方式.
第一种方式: 对象冒充
其原理就是:构造函数使用this关键字给所有属性和方法赋值(即采用类声明的构造函数方式)。因为构造函数只是一个函数,所以可使ClassA的构造函数成为ClassB的方法然后调用它.ClassB就会收到ClassA的构造函数中定义的属性和方法.(从而实现继承的功效)
- //这里其实是把ClassA 作为常规函数来建立继承机制,而不是作为构造函数
- function ClassA(sColor) {
- // js中函数是对象,对象就会有自己的属性与方法
- this.color = sColor;
- this.sayColor = function() {
- alert(this.color);
- };
- }
- function ClassB(sColor, name) {
- this.newMethod = ClassA;
- this.newMethod(sColor);
- //子类在定义新属性与新方法前都必须删除继承的父类,否则可能会覆盖超类的相关属性和方法
- delete this.newMethod;
- //子类ClassB定义自己的属性与方法
- this.name = sName;
- this.sayName = function() {
- alert(this.name);
- };
- }
- //运行
- var objA = new ClassA("red");
- var objB = new ClassB("blue", "hello");
- objA.sayColor(); //输出 "red"
- objB.sayColor(); //输出 "blue"
- objB.sayName(); //输出 "hello"
对象冒充方式的继承机制更强的一点就是可以支持多重继承(一个类可以继承多个超类)。实现的方法与继承一个类同样的.
如上例可写成:
- function ClassB(sColor, name) {
- //继承ClassA
- this.newMethod = ClassA;
- this.newMethod(sColor);
- delete this.newMethod;
- //继承ClassC 假设ClassC已定义
- this.newMethod = ClassC;
- this.newMethod();
- delete this.newMethod;
- ......
- }