JavaScript中的几种继承方式

痛定思痛。 2022-07-10 04:22 297阅读 0赞

JavaScript中的几种继承方式:

一:原型链

让原型对象等于另一个类型的实例.此时,原型对象包含一个指向另一个原型的指针,相应地,另一个原型中也包含着指向另一个构造函数的指针.

  1. function A()\{
  2. this.prototype = true;
  3. \}
  4. A.prototype.getAValue = function()\{
  5. return this.prototype;
  6. \}
  7. function B()\{
  8. this.Bprototype = false;
  9. \}
  10. //B继承A
  11. B.prototype = new A();
  12. var b = new B();
  13. alert(b.getAValue()); //true
  14. 缺点:
  15. 1.包含引用类型值的原型属性会被所以实例共享.
  16. 2.在创建子类型的实例时,不能向超类型的构造函数传递参数.

二:借用构造函数

在子类型构造函数的内部调用超类型的构造函数

  1. function A(name)\{
  2. this.color =\["red"\];
  3. this.name = name;
  4. \}
  5. function B()\{
  6. //B继承A
  7. A.call(this,"Tom");
  8. \}
  9. var b = new B();
  10. alert(b.name); // Tom
  11. b.color.push("blue");
  12. alert(b.color); // red,blue
  13. var b2 = new B();
  14. alert(b.color); // red
  15. 优点:可以在子类型构造函数向超类型的构造函数传递参数.
  16. 缺点:
  17. 1.如果仅仅借用构造函数,那么将无法避免构造函数存在的问题:方法都在构造函数中定义,因此函数无法复用.
  18. 2.在超类型中定义的函数,在子类中不可见,只能使用构造函数模式,因此,这种方式很少单独使用.

三:组合继承

  1. 使用原形链实现对原型属性和方法的继承,通过借用构造函数实现对实例属性的继承,这是JavaScript中最常用的继承模式.
  2. 缺点:调用两次超类型的构造函数

四:原型式继承

在object()函数内部先创建一个临时性的构造函数,然后将传人的对象作为这个构造函数的原型,最后再返回这个临时类型的新实例

  1. function object(o)\{
  2. function F()\{\}
  3. F.prototype = o;
  4. return new F();
  5. \}
  6. 缺点:包含引用类型值的属性始终都会共享相应的值,就像使用原型模式一样.
  7. 在没必要创建构造函数,而只是想让一个对象和另一个对象保持类似的情况下,可以使用原型式继承.

五:寄生式继承

创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再返回对象.

  1. function createAnother(o)\{
  2. var clone = object(o);
  3. clone.sayHi()\{
  4. alert('hi');
  5. \};
  6. return clone;
  7. \}

var Person = {

  1. name: "Tom"
  2. \};
  3. var anotherPerson = createAnother(Perpso);
  4. anotherPerson.sayHi(); //"hi"
  5. 缺点:使用寄生式继承来为对象添加函数,会由于不能做到函数复用而降低效率(与构造函数模式类似).

六:寄生组合式继承

用借用构造函数来继承属性,通过原型链的混成形势来继承方法.

  1. 思路:不必为了指定子类型的原型而调用超类型的构造函数,而所需要的无非就是超类型原型的一个副本而已.本质上就是,使用寄生式继承来继承超类型的原型,然后再将结果指 定给子类型的原型.
  2. function inheritPrototype(B,A)\{
  3. var prototype = object(A.prototype); //创建对象
  4. prototype.constructor = B; //增强对象
  5. B.prototype = prototype; //指定对象
  6. \}
  7. inheritPrototype()函数实现了寄生组合继承的最简单形式.
  8. 优点:只调用一次超类型的构造函数

发表评论

表情:
评论列表 (有 0 条评论,297人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JS继承方式

    1.原型继承 核心:将父类的实例作为子类的原型(并不是把父类中的属性和方法克隆一份一模一样的给子类,而是让子类父类之间增加了原型链接) 特点:父类中私有的和公有的都继