prototype、__ptoto__

2019-11-08  本文已影响0人  royluck
        // 父类
        let SuperClass = function (val) {
            this.name = '父类'
            this.supVal = val
        }
        SuperClass.prototype.getName = function () {
            console.log(this.name)
        }

        let sup = new SuperClass('1111')

        // 子类(继承父类SuperClass)
        let SubClass = function (val) {
            this.name = '子类'
            this.subVal = val
        }

        SubClass.prototype = new SuperClass()

        SubClass.prototype.getSubVal = function () {
            console.log(this.subVal)
        }

        // 验证:
        // SuperClass.prototype.constructor == SuperClass // =>true
        // Object.prototype == SuperClass.prototype.__proto__ // => true
        // Object.prototype == Function.prototype.__proto__ // => true
        // SuperClass.prototype.__proto__ == Function.prototype.__proto__ // => true

        // SuperClass.prototype == SubClass.prototype.__proto__ // => true
        // SubClass.__proto__ == Function.prototype // => true
        // SubClass.prototype.__proto__ == SuperClass.prototype // => true

        // 实例出来的对象,其继承过来的supVal值为 undefined
        // 这里不能给父类supVal定义值,所以ES5有几种设计模式,用于解决这种情况
        // 例如:构造函数继承 组合继承 原型式继承 寄生式继承 寄生组合式继承...
        // ES6新增了语法糖 class,因此不用像ES5那样创建类
        let sub = new SubClass('0000')
> 下面以上述两个类为例,讨论 proto、 prototype、 constructor的关系:
关键概念前置:



1573196008(1).jpg

思考拓展: 在平时的代码中,有时候你能看到 SubClass.prototype = new SuperClass()指向一个实例,有时 SubClass.prototype = Object.create(SuperClass.prototype)指向原型,那么二者有什么区别呢?


更新:20200629

上一篇下一篇

猜你喜欢

热点阅读