能否在JavaScript类中嵌入构造函数作为其方法?
在类内部实现专属构造函数的可行方案
当然可以在类内部实现这类仅被当前类使用的构造函数,下面是几种实用的实现方式:
方案一:静态构造函数(推荐,共享逻辑)
把Node构造函数声明为Collection的静态方法,它属于类本身而非单个实例,不会重复创建,适合不需要每个实例独立构造逻辑的场景:
class Collection { constructor() { this.collection = []; } static Node(value) { this.value = value; } addNode(value) { const node = new Collection.Node(value); this.collection.push(node); console.log(this.collection); } } // 要是需要给Node加原型方法,直接在外部补充就行 Collection.Node.prototype.getValue = function() { return this.value; }; const col = new Collection(); col.addNode("foo");
方案二:实例级构造函数(独立逻辑)
通过类字段语法把Node定义为实例的属性,每个Collection实例会拥有独立的Node构造函数,适合需要每个实例的Node逻辑有差异的场景:
class Collection { constructor() { this.collection = []; } Node = function(value) { this.value = value; }; addNode(value) { const node = new this.Node(value); this.collection.push(node); console.log(this.collection); } } const col = new Collection(); col.addNode("foo");
方案三:嵌套类(现代JS语法)
ES2022及之后的标准已经支持在类内部定义嵌套类,写法更直观,同样分实例级和静态级两种:
实例级嵌套类
每个Collection实例会有自己的Node类:
class Collection { constructor() { this.collection = []; } class Node { constructor(value) { this.value = value; } } addNode(value) { const node = new this.Node(value); this.collection.push(node); console.log(this.collection); } } const col = new Collection(); col.addNode("foo");
静态嵌套类
所有Collection实例共享同一个Node类:
class Collection { constructor() { this.collection = []; } static class Node { constructor(value) { this.value = value; } } addNode(value) { const node = new Collection.Node(value); this.collection.push(node); console.log(this.collection); } } const col = new Collection(); col.addNode("foo");
为什么你之前的写法报错?
你之前把Node声明成了普通的实例方法,当用new this.Node时,这个方法内部的this指向的是Collection实例,而不是新创建的Node对象,导致构造逻辑完全错误,所以才会抛出x is not a constructor的异常。
内容的提问来源于stack exchange,提问作者user12273078
相关产品推荐
相关产品推荐

