其它语言里用extends
即可,但是js貌似没有原生的解决方案,导致很多框架都自己实现了一套extends
方法。目前看到比较多的就是把父类的方法再拷贝(或者引用?)到子类中,这种做法效率高吗?业内的通行做法是?
迷茫2017-04-10 15:00:18
简而言之,传统的面向对象要素:
可以由一个类的构造函数构造出若干个同类的对象
JavaScript 的 new 关键字允许将一个函数视作构造函数,可以创建出若干个与这个构造函数相关联的对象,JavaScript 没有类的概念,构造函数代替类的概念,作为这一类对象的标识。
类可以拥有静态方法和静态属性
直接为构造函数设置属性即可,在 JavaScript 中方法和属性几乎没有什么区别。
对象可以拥有实例属性,这些属性每个对象都有一份拷贝
应在构造函数中为新建的对象(构造函数中的 this)初始化实例属性,这些属性不会与其他对象共享。
对象可以拥有实例方法,这些方法来自于类的定义
JavaScript 对象会从其原型对象继承属性和方法,由 new 关键字创建的对象的原型默认是构造函数的原型,因此可以通过为构造函数的原型添加方法的方式,为其创建的对象添加共用的方法。
一个类(派生类)可以继承自另一个类(基类),派生类可以覆盖来自基类的方法
应将派生类的构造函数的原型的原型,设置为被继承的的构造函数的原型,在进行方法调用时,JavaScript 会沿着原型链逐个查找方法。派生类可以通过为构造函数的原型设置方法的方式,覆盖来自基类的方法。
在基类中调用派生类对象的方法时,如果这个方法被派生类覆盖,那么应调用派生类的方法(多态)
JavaScript 会沿着原型链查找方法,一旦在派生类找到了同名方法,就不会使用基类的方法。
详见 JavaScript 权威指南
阿神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
}
}
大家讲道理2017-04-10 15:00:18
《JavaScript 权威指南》第六版里面第九章 Classes and Modules 的 9.3 Java-Style Classes in JavaScript,
看完你就懂了。