原型链和继承

Posted bighengheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原型链和继承相关的知识,希望对你有一定的参考价值。

1. 构造函数与实例对象

首先我做了如下测试

var A = function(a){
        this.a = a;
        var b = ‘b‘;
        var fn = function(){
          alert(a);
        }
        this.fn1 = fn;
      };
      var a = new A(‘a‘);

得到的结果是:

a.a = “a”
a.b. undefined
a.fn undefined
a.fn1

ƒ (){

 alert(‘b‘);

 }

得到结论是:构造函数的属性和方法一定要挂在this下面,它的实例化对象才能用,定义在构造函数自己内部的,只要不挂在this上,就不可以给实例化对象使用 是undefined

然后我又尝试使用prototype给构造函数添加属性和发放供实例化对象使用

A.prototype.c = ‘c‘;
A.prototype.fn3 = function(){alert(3);}

得到结果是:

a.c
"c"
a.fn3
ƒ (){alert(3);}

以上是,构造函数和实例化对象的关系

 2. 对象和对象

首先,既然 prototype后面可以. 属性,可以. 方法就证明本身prototype就是对象

那么,如果要让一个对象在另一个对象的原型链上,只要直接改变prototype就可以

var obj ={ 
    sex: “f”,
}
var A = function(a){
    this.a = a;
}
A.prototype = obj;
var a = new A(1);

那么就可以读到a.sex ->>f

得到结论是:将构造函数的原型设置为另一个构造函数的实例对象,就可以让这个原型在另一个构造函数的原型链上,与另一个构造函数的对象产生继承关系。

以下,是我自己写的一个长一点的对象继承

var Person = function(sex,age){

        this.sex = sex;

        this.age = age;

      }

      var person = new Person(‘female‘,18);

      var Studunt = function(major){

        this.major = major;

      }

      Studunt.prototype = person;

      var s1 = new Studunt(‘math‘);

      // console.log(s1.sex,s1.age,s1.scroe);

      var Exam = function(score){

        this.scroe = score;

      }

      Exam.prototype = s1;

      var e = new Exam(100);

      console.log(e);

3. instanceof 和 isPrototypeOf

从字面能看出来含义

isPrototypeOf: A.isPrototypeOf(B),A是B的原型 (它是函数)

instanceof: A.instanceof(B), A是B的实例,但是这个不是这么用的因为它不是函数,只是运算符,好像< > ==一样

所以就直接A instanceof B 

4. prototype 和 __proto__

 prototype是构造函数的对象,只有构造函数可以用

__proto__是实例对象的对象,只有实例对象可以用

对象的__proto__指向的是自己构造函数的prototype

5. constructor

之前老是搞不懂constructor,刚刚看到一个图片,豁然开朗

 技术图片

 

Constructor就是一个获取构造函数的途径,好像一个指针一样,指着构造函数

实例化对象可以用(这个图上没体现出来)

e.constructor

ƒ (sex,age){

        this.sex = sex;

        this.age = age;

      }

原型对象也可以用

e.__proto__.constructor

ƒ (sex,age){

        this.sex = sex;

        this.age = age;

      }

Person.prototype.constructor == Person //构造函数的原型对象的构造函数就是它自己

然后下面这个就很清晰了

p1.__proto__ === Person.prototype       //true 

p2.__proto__ === Person.prototype   //true

p1.__proto__ === p2.__proto__           //true

Person.prototype.constructor === Person  //true

6. 最后,是继承这块硬骨头

继承的实现方式有以下几种:

  • 原型链继承

就是我上面写的那个,总的来说就一行代码:

Student.prototype = new Person(“male”,20);
  • 类式继承——构造函数继承,用到call
 var Person = function(age){
        this.age = age;
 }
      var Studunt = function(score,age){
        this.score = score;
        Person.call(this,age);//执行了一下Person(),相当于把 this.age = age;这行代码粘贴到这了,并且这个this就是我后面传的这个自己的this,age也是自己的age.
      }
      var s = new Studunt(100,20);
  • 组合方式继承

 组合方式没看懂,让大鹅讲讲

哎呀妈呀 还有寄生组合方式。。。 这面试用不用啊 不用就不学了

es6——extend————这个再背一背

加一个father是怎么定义的

class father{

}

class Children extends Father{

consotructor(name){

super(parentName);

this.name = name;

}

sayName() {

  console.log(‘child name:‘, this.name);

    }

}

 

以上是关于原型链和继承的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高级原型和继承相关:原型对象函数原型原型链和继承继承的优化对象判断相关方法

JavaScript高级原型和继承相关:原型对象函数原型原型链和继承继承的优化对象判断相关方法

原型链和继承

对Javascript的原型,原型链和继承的个人理解

js原型链和继承的理解

关于原型原型链和原型继承的理解