利用空对象作为中介继承、原型链直接继承

103 阅读1分钟

【利用空对象作为中介】 

@param 子类

 @param 父类

function extend(child, parent) {

function f() { }

f.prototype = parent.prototype;

child.prototype = new f();

child.prototype.constructor = child;

}

Object.prototype.foot = 2;

空对象,几乎不占内存

修改Student的prototype对象,不会影响到Person的prototype对象

【 父类 】

function Person() { }

Person.prototype.head = 1;

Person.prototype.foot = 2;

 【子类想继承父类的属性 】

function Student() { }

 【新建一个空对象 】

 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);

原型链就是一层一层向上找的过程 

原型链继承就是利用了上面这种特性 

 写一个类 Car color price 属性 

 类 Bmw 继承Car的所有属性 并实例化Bmw这个类

写个方法可以把 color 和 price 打印到页面上 

function Car() {

}

Car.prototype.color = '白色'

Car.prototype.price = '100w'

 function f(){}

 f.prototype = Car.prototype;

 Bmw.prototype = new f();

 Bmw.prototype.constructor = Bmw;

extend(Bmw, Car)

function Bmw() {

this.print = function () {

document.write(`this.color{this.color}--{this.price}`);

}

}

let b1 = new Bmw();

b1.print();

【原型链继承直接继承原型】

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

Student想要继承Person的属性 

 直接继承prototype 

缺点: 

 任何对Student.prototype的修改,都会反映到Person.prototype 

 Student的constructor不会指向自己