search

Home  >  Q&A  >  body text

javascript - js实现继承的最佳方式是什么

其它语言里用extends即可,但是js貌似没有原生的解决方案,导致很多框架都自己实现了一套extends方法。目前看到比较多的就是把父类的方法再拷贝(或者引用?)到子类中,这种做法效率高吗?业内的通行做法是?

巴扎黑巴扎黑2897 days ago262

reply all(4)I'll reply

  • 迷茫

    迷茫2017-04-10 15:00:18

    简而言之,传统的面向对象要素:

    • 可以由一个类的构造函数构造出若干个同类的对象

      JavaScript 的 new 关键字允许将一个函数视作构造函数,可以创建出若干个与这个构造函数相关联的对象,JavaScript 没有类的概念,构造函数代替类的概念,作为这一类对象的标识。

    • 类可以拥有静态方法和静态属性

      直接为构造函数设置属性即可,在 JavaScript 中方法和属性几乎没有什么区别。

    • 对象可以拥有实例属性,这些属性每个对象都有一份拷贝

      应在构造函数中为新建的对象(构造函数中的 this)初始化实例属性,这些属性不会与其他对象共享。

    • 对象可以拥有实例方法,这些方法来自于类的定义

      JavaScript 对象会从其原型对象继承属性和方法,由 new 关键字创建的对象的原型默认是构造函数的原型,因此可以通过为构造函数的原型添加方法的方式,为其创建的对象添加共用的方法。

    • 一个类(派生类)可以继承自另一个类(基类),派生类可以覆盖来自基类的方法

      应将派生类的构造函数的原型的原型,设置为被继承的的构造函数的原型,在进行方法调用时,JavaScript 会沿着原型链逐个查找方法。派生类可以通过为构造函数的原型设置方法的方式,覆盖来自基类的方法。

    • 在基类中调用派生类对象的方法时,如果这个方法被派生类覆盖,那么应调用派生类的方法(多态)

      JavaScript 会沿着原型链查找方法,一旦在派生类找到了同名方法,就不会使用基类的方法。

    详见 JavaScript 权威指南

    reply
    0
  • 阿神

    阿神2017-04-10 15:00:18

    没有规范的原因大概是我们要的东西不一样!我觉得是这样我就这样写,他觉得那样好就那样写。大家都在写适合自己的继承实现,下面的可以说是最基本的也是效率最高的继承。

        if (typeof Object.create === 'function') {
          module.exports = function inherits(ctor, superCtor) {
            ctor.super_ = superCtor
            ctor.prototype = Object.create(superCtor.prototype, {
              constructor: {
                value: ctor,
                enumerable: false,
                writable: true,
                configurable: true
              }
            });
          };
        } else {
          // old school shim for old browsers
          module.exports = function inherits(ctor, superCtor) {
            ctor.super_ = superCtor
            var TempCtor = function () {}
            TempCtor.prototype = superCtor.prototype
            ctor.prototype = new TempCtor()
            ctor.prototype.constructor = ctor
          }
        }
    

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:00:18

    《JavaScript 权威指南》第六版里面第九章 Classes and Modules 的 9.3 Java-Style Classes in JavaScript,
    看完你就懂了。

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 15:00:18

    看我的文章:JavaScript继承方式详解
    没那么麻烦,实现继承都是通过原型链,最佳的是组合继承

    reply
    0
  • Cancelreply