JavaScript进阶(六)继承

195 阅读1分钟

这是我参与8月更文挑战的第二十七天,活动详情查看:8月更文挑战

JavaScript进阶

JavaScript进阶(二)

JavaScript进阶(三)模块化

JavaScript进阶(四)防抖

JavaScript进阶(五)节流

对于使用过基于类的语言 (如 Java 或 C++) 的开发者们来说,JavaScript 是比较费解的 —— JavaScript 是动态的,本身不提供一个 class 的实现。即便是在 ES2015/ES6 中引入了 class 关键字,但那也只是语法糖,JavaScript 仍然是基于原型的。

继承

ES5

  • 首先来我们看一下在 ES 5中是如何实现继承的
function son() {
son.prototype.getName = function() {
    return 'son'
}
function father() {}
let name = new father()
father.prototype = Object.create(son.prototype, {
    constructor: {
        name: 'father',
        sex:'male',    
        age: '66'
    }
})
  • 如上代码,我们通过原型链的形式把son类的方法给了father

ES6

  • ES中,我们就可以通过提供的Class关键词和extends来实现继承
class father {

    getName() {

        return 'father'

    }

}

class son extends father {

    getName() {

        return 'son'

    }

}

let bigSon = new son()

bigSon.getName()

如上代码,就是通过ES6的语法来实现继承的,并重构了getName方法。

  • 但是有一点是需要注意的,虽然ES6已经很普遍了,但是还有一些老旧的项目是没有继承ES6语法的,这个时候我们就需要一种编码工具,把它转换为 ES5语法了,他就是babel

那他是怎么做到的,我们可以随便找一个转译工具下看看转译后的代码。

var father = function () {
    function father() {
        _classCallCheck(this, father);
    }

    _createClass(father, [{
        key: 'getName',
        value: function getName() {

            return 'father';
        }
    }]);

    return father;
}();

var son = function (_father) {
    _inherits(son, _father);

    function son() {
        _classCallCheck(this, son);

        return _possibleConstructorReturn(this, (son.__proto__ || Object.getPrototypeOf(son)).apply(this, arguments));
    }

    _createClass(son, [{
        key: 'getName',
        value: function getName() {

            return 'son';
        }
    }]);

    return son;
}(father);

var bigSon = new son();

bigSon.getName();
  • 通过如上代码我们可以发现,这就是ES5的 语法,但需要注意的是 他里面用到了 apply 这个方法。

END~~~