本文实例讲述了javascript面向对象三大特征之继承。分享给大家供大家参考,具体如下:
继承
在JavaScript中的继承的实质就是子代可以拥有父代公开的一些属性和方法,在js编程时,我们一般将相同的属性放到父类中,然后在子类定义自己独特的属性,这样的好处是减少代码重复。继承是面向对象的基础,是代码重用的一种重要机制。
——此文整理自 《jQuery 开发从入门到精通》 ,这是本好书,讲的很详细,建议购买阅读。
继承的作用
实现继承的主要作用是:
① 子类实例可以共享超类属性和方法。
② 子类可以覆盖和扩展超类属性和方法。
继承的分类
在JavaScript中是不支持类的概念,使用构造器机制来实现类的特性。
JavaScript中类的继承不止一种,主要包括:类继承(构造函数继承),原型继承,实例继承,复制继承,克隆继承,混合继承,多重继承等。
类继承
类继承也叫构造函数继承,其表现形式是在子类中执行父类的构造函数。实现本质:比如把一个构造函数A的方法赋值为另一个构造函数B,然后调用该方法,使构造函数A在构造函数B内部执行,这是构造函数B就拥有了构造函数A中定义的属性和方法。这就是B类继承A类。示例如下:
function A(x){ this.x = x; this.say = function() { console.log(this.x + ' say'); }}function B(x,y) { this.m = A; // 把构造函数A作为一个普通函数引给临时方法m() this.m(x); // 把当前参数作为值传给构造函数A,并且执行 delete this.m; // 清除临时方法 this.y = y; this.call = function(){ console.log(this.y); }}// 测试类继承var a = new A(1);var b = new B(2,3);a.say(); // 1 sayb.say(); // 2 sayb.call(); // 3
上面的实现方式很巧妙对吧,但是这种设计方式太随意,缺乏严密性。严禁的设计模式应该考虑到各种可能存在的情况和类继承关系中的互相耦合性。所以一般我们尽可能把子类自身的方法放在原型里去实现。下面这种创建方式会更好:
function A(x){ this.x = x; this.say = function() { console.log(this.x + ' say'); }}function B(x,y){ this.y = y; A.call(this,x); // 在构造函数B内调用超类A,实现绑定,用call来实现借用}B.prototype = new A(); // 设置原型链,建立继承关系B.prototype.constructor = B; // 恢复B的原型对象的构造函数为B,如果不操作就会指向AB.prototype.gety = function(){ // 给类B添加新的方法 return this.y;}// 测试 类继承var a = new A('A');var b = new B('Bx','By');a.say(); // A sayb.say(); // Bx sayconsole.log(b.gety()); // Byconsole.log(B.prototype.__proto__ === A.prototype); // true;console.log(b.constructor === B); // true 这里也可以把B中的 B.prototype.constructor = B; 去除,结果为false
新闻热点
疑难解答
图片精选