面向对象

87 阅读1分钟

来判断这个实例(p1)是不是这个构造函数(Person)实例化出来的对象

  console.log(p1 instanceof Person); =>true 
 console.log(p1 instanceof Student);  =>false 
 

万物皆对象

       构造函数可以理解为一个类 
     function Person(){
         this.head = 1;
         this.foot = 2;
     }
     function Student(name,no){
         this.name = name;
         this.no = no;
     }
    

让学生类 继承 人类的两个脚和一个头的属性

Student的prototype指向一个Person的实例

     Student.prototype = new Person();
    

加上constructor属性,并将这个属性指回原来的构造函数

     Student.prototype.constructor = Student;
     let stu1 = new Student();
     console.log(stu1);

     console.log(stu1.head);
     console.log(stu1.foot);



    

不变的属性都可以直接写入Person.prototype

Student想要继承Person的属性

直接继承prototype

    // Student.prototype = Person.prototype;
    // let stu1 = new Student();
    // console.log(stu1.head);
    // console.log(stu1.foot);
    // // console.log('stu1',stu1);

缺点: 任何对Student.prototype的修改,都会反映到Person.prototype Student的constructor不会指向自己

空对象,几乎不占内存 修改Student的prototype对象,不会影响到Person的prototype对象

新建一个空对象

        function f(){}
    

把父类的原型直接赋值给空对象的原型

        f.prototype = Person.prototype;
    

把空对象的实例化对象 给到子类的原型上

        Student.prototype = new f();
    

★constructor构造器都是指向自己的

        Student.prototype.constructor = Student;

    extend(Student, Person)
    let stu1 = new Student();
    console.log(stu1.foot);
    console.log(stu1)

不会影响到Person的prototype对象

     Student.prototype.age = 30;
        let p = new Person();
        console.log(p);

原型链就是一层一层向上找的过程 原型链继承就是利用了上面这种特性