抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

面向对象三大特性:继承、封装、多态,今天把JavaScript的继承给他实现了

知识补充

prototype

在JavaScript中,prototype对象是实现面向对象的一个重要机制。

每个函数就是一个对象(Function),函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一个类的成员的集合。

constructor

构造函数属于被实例化的特定类对象 。构造函数初始化这个对象,并提供可以访问其私有信息的方法。构造函数的概念可以应用于大多数面向对象的编程语言。

constructor位于prototype中,是prototype的一个属性

手动实现

// 原型工厂继承
function extend(sub, sup) {
    // 将子类的prototype指向父类的prototype(新创建的对象不会污染原prototype)
    sub.prototype = Object.create(sup.prototype)
    // construct被覆盖了,再添加回去,并且禁止遍历
    Object.defineProperty(sub.constructor, "constructor", {
        value: sub,
        enumerable: false
    })
}

这里的create是根据父类的prototype生成一个新对象(深拷贝),将该对象挂载到子类的prototype上,因为constructor是prototype的一个属性,执行完第一步后新对象就把constructor给覆盖了,这个构造函数很重要,要把构造函数重新添加回来

测试:

function Person() {
    this.type = 'animal'
}

function SunZehui() {
    Person.call(this) // 这里相当于super()
}

extend(SunZehui, Person)
console.log('子类prototype:', SunZehui.prototype)
console.log(new SunZehui().type)
/* output:

子类prototype: Person {}
animal

*/

子类要手动执行一下super,这个是为了把父类的属性复制下来

评论