JS 的类其实就是一个函数。从某种意义上讲,定义构造函数就是定义类。构造函数是类的“公共标识”。

原型对象是类的“唯一标识”:当且仅当两个对象继承自同一个原型对象时,它们才是属于同一个类的实例。

/* 当使用instanceof运算符来检测对象是否属于某个类时,

  • 它不会检查这个对象是否由某个构造函数初始化而来,
  • 而是检查它是否继承自这个构造函数的prototype属性 */
    rnage instanceof Range // 判断range是否继承自Range.prototype,若是,返回true

ES2015 之前定义类的步骤:① 定义一个构造函数并设置初始化新对象的实例属性; => ② 给构造函数的prototype对象定义实例方法; => ③ 给构造函数定义类字段和类属性。

// ①定义一个构造函数并设置初始化新对象的实例属性
function Point(x, y) {
// ③给构造函数定义类字段和类属性
this.x = x;
this.y = y;
}
// ②给构造函数的prototype对象定义实例方法

Point.prototype.toString = function () {
  return `(${this.x}, ${this.y})`;
};

var p = new Point(1, 2);
// 也可以将这3个步骤封装进一个函数中
function defineClass(constructor, /* 设置实例属性的函数 /
methods, /
实例的方法 /
statics, /
类属性,复制至构造函数中 */) {
// 将实例方法复制到原型对象中
if (methods) extend(constructor.prototype, methods);
// 将类属性复制至构造函数中
if (static) extend(constructor, statics);
return constructor;
}
let SimplePoint = defineClass (
function(f, t) { this.f = f; this.t = t },
{
includes: function(x) { return this.f<=x && x<=this.t; },
toString: function() { return `{this.t}`; }
},
{ upto: function(t) { return new SimpleRange(0, t); } }
);

ES2015 引入 Class 的概念,通过class关键字可以定义类:

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  toString() {
    return `(${this.x}, ${this.y})`;
  }
}

class可以看做是一个语法糖,这个写法只是让对象原型的写法更清晰、更像面向对象编程的语法。

Notice:

① 定义类的方法时,前面不能加上function关键字,直接写函数定义就可以了。

② 方法之间不需要逗号分隔,加了会报错。

class内部所有定义的方法都是不可枚举的,而函数原型定义的方法是可枚举的。

class Point {
// class内部的定义方法是不可枚举的
constructor() { /* ... / }
toString() { /
... / }
}
// 原型定义的方法是可枚举的
Point.prototype.toString = function() { /
... */ }

constructor 方法
constructor()是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方***被默认添加。

class Point {}
// 等同于
class Point {
constructor() {} // JS引擎自动添加空的constructor()

constructor()默认返回实例对象(即this),可以指定返回另外一个对象。

class Foo {
constructor() {
return Object.create(null);
}
}
new Foo() instanceof Foo; // false

生成类的实例的写法,就是使用new命令。类必须使用new调用,否则会报错,而普通构造函数不需要new也可以执行。

实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)。
————————————————
版权声明:本文为CSDN博主「Mirror_Y」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Mirror_r/java/article/details/94447015