前言
最近在读《你不知道的Javascript》 系列,读到关于原型和类的部分,里面提到一个观点:js中只有对象,没有类这个概念。
在网上搜索关于“Javascript” 中是否有类 的问题,有很多争议。
一段比较准确的描述是:
在ECMAScript 6出现class的概念之后,才算是告别了直接通过原型对象来模拟类和类继承,但class也只是基于JavaScript原型继承的语法糖,并没有引入新的对象继承模式。
这篇文章并不是为 Js是否有"类" 这个问题盖棺定论,而是看Js具体是如何通过原型实现传统 面向对象语言class关键字的功能的。
阅读本篇前,你需要提前了解什么是真正的类和面向对象编程思想,以及js的原型链设计。
我们开始吧。
Js是如何实现类的
es 5: 构造函数法
用构造函数模拟“类”,在其内部用this关键字指代实例对象,用 new 关键字生成实例。
function Cat(){
this.name = "大毛";
//作为构造函数被调用时,this指向实例,这里定义了实例的属性
}
// 定义在 构造函数 原型链上的属性和方法,被所有实例共享,是同一个值(引用)
Cat.prototype.makeSound = function(){
alert("喵喵喵");
}
es 6: class关键字
class Animal {
constructor(name,age){
this.name = name;
this.age = age;
this.move= function(){
};
}
static sleep(){
console.log('sleeping')
}
speakSomething(){
console.log(123)
}
//公共属性,转译配置需要插件 plugin-proposal-calss-properties
height = 0;
}
经过babel转译后看到的代码如下(babel preset: es2015-loose):
"use strict";
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value