面向对象的继承

93 阅读1分钟

原型

js中每个对象都有一个特殊的内置属性[[prototype]],这个特殊的对象可以指向另一个对象。 函数中有一个特殊的属性叫做原型(prototype)。

原型链

原型链就是当我们访问对象的某个属性或方法时,如果当前对象中找不到定义,会继续在当前对象的原型对象中查找,如果原型对象中依然没有找到,会继续在原型对象的原型中查找,直到找到为止,或者到最底层的原型对象中也没有找到,就结束查找,返回undefined。这个查找的过程是一个链式的查找,每个对象都有一个它自身原型对象的链接,这些链接组成的整个链条就是原型链。

通过原型链实现继承

function Person() {
    this.name = 'zz'
}
Person.prototype.running = function() {}

function Student() {
    this.sno = 1
}

let p = new Person()
Student.prototype = p

缺点: 某些属性是保存中p对象上的,如果这些属性是一个引用类型,并被多个对象共享,会造成问题 不能给Person传递参数,因为这个对象是一次性创建的,没法定制化。

借用构造函数继承

function Person() {
    this.name = 'zz'
}
function Student(name, sno) {
    Person.call(this, name)
    this.sno = sno
}
Student.prototype = Person.prototype