JavaScript 继承全解析

JAVAScript 继承全解析(建议收藏)在大多数的编程语言中,继承都是一个重要的主题 。

JavaScript 继承全解析

文章插图
 
在那些基于类的编程语言中,继承提供了两个有用的服务 。首先,它是代码重用的一种形式 。如果一个新的类和一个已经存在的类大部分相似,那么你只须说明其不同点即可 。
代码重用的模式极为重要,因为它们很有可能显著地减少软件开发的成本 。类继承的另一个好处是它包括了一套类型系统的规范 。由于程序员无需显式类型转换的代码,他们的工作量将大大的减轻,这是一件很好的事情,因为类型转换时会丢失类型系统在安全上的好处 。
JavaScript 是一门弱类型语言,从不需要类型转换 。对象的起源是无关紧要的,对于一个对象来说重要的是它能做什么,而不是它从哪里来 。
JavaScript 提供了一套更为丰富的代码重用模式,它可以模拟那些基于类的模式,同时它也可以支持其他更具表现力的模式 。在 JavaScript 可能的继承模式有很多 。
在基于类的语言中,对象是类的实例,并且类可以从另一个类继承而来 。JavaScript 是一门基于原型的语言,这意味着对象直接从其他对象继承 。
原型可以直接从对象继承 。
伪类JavaScript 的原型存在着诸多的矛盾 。某些看起来有点像基于类的语言的复杂语法问题遮蔽了它的原型机制 。它不让对象直接从其他对象继承,反而插入了一个多余的间接层,从而使构造器函数产生对象 。
当一个函数对象被创建时,Function 构造器产生的函数对象会运行类似这样一个代码:
this.prototype = {    concstructor: this}新函数对象被赋予一个 prototype 属性,其值是包含一个 constructor 属性且属性值为该函数对象 。该 prototype 对象是存放继承特征的地方 。因为 JavaScript 语言没有提供一种方法去确定哪个函数是打算来做构造器的,所以每个函数都会得到一个 prototype 对象 。constructor 属性没什么用 。重要的是 prototype 对象 。
当采用构造器调用模式,即使用 new 前缀去调用一个函数时,这将修改函数执行的方式 。
如果 new 运算符是一个方法,而不是一个运算符,它可能会像这样执行 。
【JavaScript 继承全解析】if(typeof Object.beget !== 'function') {    Object.beget = function(o) {        var F = function() {}        F.prototype = o        return new F()    }}Function.prototype.method = function (name, func) {    if(!this.prototype[name]) {        this.prototype[name] = func        return this    }}Function.method('new', function () {    // 创建一个新对象,它继承自构造器函数的原型对象.    var that = Object.beget(this.prototype)    // 调用构造器函数,绑定 this 到新新对象 。    var other = this.Apply(that, arguments)    // 如果它的返回值不是一个对象,就返回该对象 。    return (typeof other === 'object' && other) || that})


    推荐阅读