js继承机制的实现apply or call

原文地址:http://www.w3school.com.cn/js/pro_js_inheritance_implementing.asp

继承机制的实现

要用 ECMAScript 实现继承机制,您可以从要继承的基类入手。所有开发者定义的类都可作为基类。出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为这些代码可以被用于恶意攻击。

选定基类后,就可以创建它的子类了。是否使用基类完全由你决定。有时,你可能想创建一个不能直接使用的基类,它只是用于给子类提供通用的函数。在这种情况下,基类被看作抽象类。

尽管 ECMAScript 并没有像其他语言那样严格地定义抽象类,但有时它的确会创建一些不允许使用的类。通常,我们称这种类为抽象类。

创建的子类将继承超类的所有属性和方法,包括构造函数及方法的实现。记住,所有属性和方法都是公用的,因此子类可直接访问这些方法。子类还可添加超类中没有的新属性和方法,也可以覆盖超类的属性和方法。

 

继承的方式

和其他功能一样,ECMAScript 实现继承的方式不止一种。这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者,你有权决定最适用的继承方式。

下面为您介绍几种具体的继承方式。

 

混合方式

实现如图的结构:

image

 function people(name, age) {//定义 类 people
            this.name = name;
            this.age = age;
        }
        people.prototype.say = function () {
            document.write("名字叫:" + this.name + ";今年" + this.age + "岁了<br/>");
        }
        function boy(name, age) { //定义类 boy 继承自 people
            people.apply(this, [name, age]);
            this.gender = "boy";
        }
        boy.prototype = new people(); // 继承people
        boy.prototype.sayGender = function () { document.write("性别:" + this.gender + "<br/>") }; //定义 boy自己的方法
        function girl(name, age) { //定义类 girl,继承自 people 和 boy
            people.apply(this, [name, age]);
            this.gender = "girl";
        }
        girl.prototype = new people();  //继承people
        girl.prototype = new boy();   //继承b  使用 b的 sayGender方法

        var p = new people("peop", 12);
        var b = new boy("小明", 12);
        var g = new girl("小丽", 12);

        p.say();
        b.say();
        b.sayGender();
        g.say();
        g.sayGender();

执行 结果:

 

image

posted @ 2012-05-18 14:18  高捍得  阅读(435)  评论(0编辑  收藏  举报