原型继承 javascript

在谈到继承的时候 多半考虑的是 面向对象  参考javascript高级程序设计 javascript编程全解

例子1 

  function Person(name,age) {
    this.name = name;
    this.age = age;

    this.show = function() {
      console.log(this.name,this.age);
    }
  }

  var person1 = new Person(‘haha‘,20);

  var person2 = new Person(‘kaka‘,22);

  console.log(person1.show == person2.show);//false

  首先以构造函数的方式来创建对象的时候 发生了如下的步骤

  (1)创建一个对象

  (2)将构造函数的作用赋给这个对象(this指向这个对象)

  (3)执行构造函数中的代码(为新对象添加属性)

  (4)返回这个对象

但是会发现这样一个问题, 就是生成的对象的方法都要在实例中重新创建一遍  就是我们实现同样的任务要创建两个方法(对象) 因此考虑到原型链

 创建的每一个函数都有一个原型属性,这个属性是一个指针,指向这样的一个对象(原型对象),这个对象包含特定类型的所有实例共享的属性和方法,这就是原型模式

  改写上面的例子

  function Person(name,age) {
    this.name = name;
    this.age = age;
  }
  Person.prototype.sayName = function() {console.log(this.name)};

  var person1 = new Person(‘haha‘,20);
  var person2 = new Person(‘kaka‘,21);

  person1.sayName();
  person2.sayName();
  console.log(person1.sayName === person2.sayName);//true

  Person的构造函数指向原型对象  Person.prototype  而原型对象的constructor属性指会Person的构造函数  也就是说当我们在实例化一个对象的实例时,原型对象会调用它的constructor属性来实例化这个对象,并且实例化的对象都有一个属性指向它的原型

     在这里面看到会存在两部分属性或者方法 Person构造函数中的属性或者方法  Person.prototype原型对象的属性或者方法,是按下面的顺序进行查找的

  (1)对象自身的属性(上面的例子中Person构造函数) 

  (2)隐式链接所引用的对象(构造函数原型对象)的属性

  (3)第2项中的对象的隐式链接所引用的对象的属性

  (4)反复按第3项的规则查找直至全部查找完毕(查找的终点是object.prototype对象)

 上述的查找属性或者函数的方式按照一个链式的结构进行查找,也就是我们说的原型链,在javascript中将原型链作为实现继承的主要方式,其基本的思想是利用原型让一个引用类型继承另一个引用类型的属性或者方法

  

  function SuperType() {
    this.property = true;
  }

  SuperType.prototype.getSuperValue = function() {
    return this.property;
  };

  function SubType() {
    this.subproperty = false;
  }

  SubType.prototype = new SuperType();

  SubType.prototype.getSubValue = function() {
    return this.subproperty;
  };

  var instance = new SubType();
  console.log(instance.getSuperValue());//true

 

 

 

 

 

 

 

 

 

 


  

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。