constructor
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since â¨2016å¹´3æâ©.
constructor ã¡ã½ããã¯ãã¯ã©ã¹ã§ä½æããããªãã¸ã§ã¯ãã¤ã³ã¹ã¿ã³ã¹ã®çæã¨åæåãè¡ãããã®ç¹æ®ãªã¡ã½ããã§ãã
ã¡ã¢:
ãã®ãã¼ã¸ã§ã¯ constructor ã®æ§æãç´¹ä»ãã¾ãããã¹ã¦ã®ãªãã¸ã§ã¯ãã«åå¨ãã constructor ããããã£ã«ã¤ãã¦ã¯ã Object.prototype.constructor ãåç
§ãã¦ãã ããã
試ãã¦ã¿ã¾ããã
class Polygon {
constructor() {
this.name = "Polygon";
}
}
const poly1 = new Polygon();
console.log(poly1.name);
// äºæ³ãããçµæ: "Polygon"
æ§æ
constructor() { /* ⦠*/ }
constructor(argument0) { /* ⦠*/ }
constructor(argument0, argument1) { /* ⦠*/ }
constructor(argument0, argument1, /* â¦, */ argumentN) { /* ⦠*/ }
追å ã®æ§æä¸ã®å¶ç´ãããã¾ãã
constructorã¨ããååã®ã¯ã©ã¹ã¡ã½ããã¯ãã²ãã¿ã¼ãã»ãã¿ã¼ãéåæãã¸ã§ãã¬ã¼ã¿ã¼ã¡ã½ããã«ãªããã¨ã¯ã§ãã¾ããã- 1 ã¤ã®ã¯ã©ã¹ãè¤æ°ã®
constructorã¡ã½ãããæã¤ãã¨ã¯ã§ãã¾ããã
解説
ã³ã³ã¹ãã©ã¯ã¿ã¼ã使ç¨ããã¨ãã¤ã³ã¹ã¿ã³ã¹åããããªãã¸ã§ã¯ãã«å¯¾ãã¦ãä»ã®ã¡ã½ãããå¼ã³åºãåã«è¡ãå¿ è¦ã®ããç¬èªã®åæåãè¡ããã¨ãã§ãã¾ãã
class Person {
constructor(name) {
this.name = name;
}
introduce() {
console.log(`ããã«ã¡ã¯ãç§ã¯${this.name}ã§ãã`);
}
}
const otto = new Person("ãªããã¼");
otto.introduce(); // ããã«ã¡ã¯ãç§ã¯ãªããã¼ã§ãã
ç¬èªã®ã³ã³ã¹ãã©ã¯ã¿ã¼ãæä¾ããªãã£ãå ´åã¯ãæ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ãæä¾ããã¾ããã¯ã©ã¹ãåºåºã¯ã©ã¹ã§ããå ´åãæ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ç©ºã§ãã
constructor() {}
ã¯ã©ã¹ãæ´¾çã¯ã©ã¹ã®å ´åãæ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã親ã³ã³ã¹ãã©ã¯ã¿ã¼ãå¼ã³åºããä¸ãããã弿°ã渡ãã¾ãã
constructor(...args) {
super(...args);
}
ã¡ã¢: ä¸è¨ã®ãããªæç¤ºçãªã³ã³ã¹ãã©ã¯ã¿ã¼ã¨æ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã®ç°ãªãç¹ã¯ãå¾è ãå®éã«ã¯é åã¤ãã¬ã¼ã¿ã¼ãå¼ã³åºãã¦å¼æ°ã®ã¹ãã¬ãããè¡ããªããã¨ã§ãã
ããããã®ãããªã³ã¼ããåä½ããããã¨ãã§ãã¾ãã
class ValidationError extends Error {
printCustomerMessage() {
return `Validation failed :-( (details: ${this.message})`;
}
}
try {
throw new ValidationError("Not a valid phone number");
} catch (error) {
if (error instanceof ValidationError) {
console.log(error.name); // ãã㯠ValidationError ã®ä»£ããã®ã¨ã©ã¼
console.log(error.printCustomerMessage());
} else {
console.log("Unknown error", error);
throw error;
}
}
ValidationError ã¯ã©ã¹ã¯ãç¬èªã®åæåãè¡ãå¿
è¦ããªããããæç¤ºçãªã³ã³ã¹ãã©ã¯ã¿ã¼ã¯å¿
è¦ããã¾ããã
æ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ãä¸ãããã弿°ãã親㮠Error ã®åæåãè¡ãã¾ãã
ãã ããç¬èªã®ã³ã³ã¹ãã©ã¯ã¿ã¼ãæä¾ããã¯ã©ã¹ã親ã¯ã©ã¹ããæ´¾çãã¦ããå ´åã¯ã super() ã使ç¨ãã¦è¦ªã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ãæç¤ºçã«å¼ã³åºãå¿
è¦ãããã¾ãã
ä¾ãã°ã以ä¸ã®ããã«ãªãã¾ãã
class ValidationError extends Error {
constructor(message) {
super(message); // 親ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã®å¼ã³åºã
this.name = "ValidationError";
this.code = "42";
}
printCustomerMessage() {
return `æ¤è¨¼ã«å¤±æãã¾ãã :-( (details: ${this.message}, code: ${this.code})`;
}
}
try {
throw new ValidationError("æ£ããé»è©±çªå·ã§ã¯ããã¾ããã");
} catch (error) {
if (error instanceof ValidationError) {
console.log(error.name); // ãã㯠ValidationError ã«ãªã
console.log(error.printCustomerMessage());
} else {
console.log("æªç¥ã®ã¨ã©ã¼ã§ã", error);
throw error;
}
}
ã¯ã©ã¹ã§ new ã使ç¨ããã¨ã以ä¸ã®æ®µéãè¸ã¿ã¾ãã
- ï¼æ´¾çã¯ã©ã¹ã®å ´åï¼
super()å¼ã³åºããè©ä¾¡ãããåã®constructoræ¬ä½ããã®é¨åã¯ã¾ã åæåããã¦ããªãã®ã§ãthisã«ã¢ã¯ã»ã¹ãã¦ã¯ããã¾ããã - ï¼æ´¾çã¯ã©ã¹ã®å ´åï¼
super()å¼ã³åºããè©ä¾¡ãããåãå¦çã§è¦ªã¯ã©ã¹ãåæåããã¾ãã - ç¾å¨ã®ã¯ã©ã¹ã®ãã£ã¼ã«ããåæåããã¾ãã
super()å¼ã³åºãå¾ã®constructoræ¬ä½ï¼åºåºã¯ã©ã¹ã®å ´åã¯æ¬ä½å ¨ä½ï¼ãè©ä¾¡ããã¾ãã
constructor æ¬ä½ã®ä¸ã§ã¯ã this ã§ä½æããããªãã¸ã§ã¯ãã«ã¢ã¯ã»ã¹ããã new ã§å¼ã³åºãããã¯ã©ã¹ã« new.target ã§ã¢ã¯ã»ã¹ããããããã¨ãã§ãã¾ããã¡ã½ããï¼ã²ãã¿ã¼ãã»ãã¿ã¼ãå«ãï¼ã¨ãããã¿ã¤ããã§ã¼ã³ 㯠constructor ãå®è¡ãããåã« this ã§åæåããã¦ããã®ã§ãã¹ã¼ãã¼ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ãããµãã¯ã©ã¹ã®ã¡ã½ããã«ã¢ã¯ã»ã¹ãããã¨ãã§ãããã¨ã«æ³¨æãã¦ãã ããããããããããã®ã¡ã½ããã this ã使ç¨ãã¦ããå ´åã this ã¯ã¾ã å®å
¨ã«åæåããã¦ãã¾ãããããã¯ãæ´¾çã¯ã©ã¹ã®ãããªãã¯ãã£ã¼ã«ããèªã㨠undefined ã«ãªãããã©ã¤ãã¼ããã£ã¼ã«ããèªã㨠TypeError ã«ãªãã¨ãããã¨ã§ãã
new (class C extends class B {
constructor() {
console.log(this.foo());
}
} {
#a = 1;
foo() {
return this.#a; // TypeError: Cannot read private member #a from an object whose class did not declare it
// ããã¯ãã¯ã©ã¹ã宣è¨ãã¦ããªãã®ã§ã¯ãªããã¹ã¼ãã¼ã¯ã©ã¹ã®
// ã³ã³ã¹ãã©ã¯ã¿ã¼ãå®è¡ããã¦ããæç¹ã§ããã©ã¤ãã¼ããã£ã¼ã«ãã
// ã¾ã åæåããã¦ããªãããã
}
})();
constructor ã¡ã½ããã¯è¿å¤ãæã¤ãã¨ãã§ãã¾ããåºåºã¯ã©ã¹ã¯ã³ã³ã¹ãã©ã¯ã¿ã¼ããä½ããã®å¤ãè¿ããã¨ãã§ãã¾ãããæ´¾çã¯ã©ã¹ã¯ãªãã¸ã§ã¯ãã¾ã㯠undefined ãè¿ããã TypeError ãçºçãããªããã°ãªãã¾ããã
class ParentClass {
constructor() {
return 1;
}
}
console.log(new ParentClass()); // ParentClass {}
// è¿å¤ã¯ãªãã¸ã§ã¯ãã§ã¯ãªãã®ã§ç¡è¦ãããã ããã¯ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã¨åãã
class ChildClass extends ParentClass {
constructor() {
return 1;
}
}
console.log(new ChildClass()); // TypeError: Derived constructors may only return object or undefined
親ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ããªãã¸ã§ã¯ããè¿ããå ´åããã®ãªãã¸ã§ã¯ãã¯æ´¾çã¯ã©ã¹ã®ã¯ã©ã¹ãã£ã¼ã«ããå®ç¾©ããéã®å¤ã¨ãã¦ä½¿ç¨ãã¾ãããã®ããªãã¯ã¯ãè¿å¤ã®ä¸æ¸ããã¨å¼ã°ããæ´¾çã¯ã©ã¹ã®ãã£ã¼ã«ãï¼ãã©ã¤ãã¼ããªãã®ãå«ãï¼ãç¡é¢ä¿ãªãªãã¸ã§ã¯ãã«å®ç¾©ãããã¨ãã§ãã¾ãã
constructor ã¯é常ã®ã¡ã½ããæ§æã«å¾ãã®ã§ãããã©ã«ã弿°ãæ®ä½å¼æ°ãªã©ããã¹ã¦ä½¿ç¨ãããã¨ãã§ãã¾ãã
class Person {
constructor(name = "åç¡ã") {
this.name = name;
}
introduce() {
console.log(`ããã«ã¡ã¯ãç§ã¯${this.name}`);
}
}
const person = new Person();
person.introduce(); // ããã«ã¡ã¯ãç§ã¯åç¡ã
ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ãªãã©ã«åã§ãªããã°ãªãã¾ãããç®åºããããã£åã¯ã³ã³ã¹ãã©ã¯ã¿ã¼ã«ã¯ãªãã¾ããã
class Foo {
// ããã¯ç®åºããããã£åã§ããã³ã³ã¹ãã©ã¯ã¿ã¼ã¨ãã¦ããã¯ã¢ããããããã¨ã¯ããã¾ããã
["constructor"]() {
console.log("called");
this.a = 1;
}
}
const foo = new Foo(); // ãã°åºåãªã
console.log(foo); // Foo {}
foo.constructor(); // "called" ã¨åºå
console.log(foo); // Foo { a: 1 }
éåæã¡ã½ãããã¸ã§ãã¬ã¼ã¿ã¼ã¡ã½ãããã¢ã¯ã»ãµãã¯ã©ã¹ãã£ã¼ã«ã㯠constructor ã¨åä»ãããã¨ã¯ç¦æ¢ããã¦ãã¾ãããã©ã¤ãã¼ããªååã #constructor ã¨å¼ã³åºããã¨ã¯ã§ãã¾ããã constructor ã¨ããååã®ã¡ã³ãã¼ã¯ãã¬ã¼ã³ãªã¡ã½ããã§ãªããã°ãªãã¾ããã
ä¾
>constructor ã¡ã½ããã®ä½¿ç¨
ãã®ã³ã¼ãã¹ããããã¯ãclasses sample (ã©ã¤ããã¢) ãã転è¼ãã¦ãã¾ãã
class Square extends Polygon {
constructor(length) {
// ããã§ã¯ãããªã´ã³ã®å¹
ã¨é«ããæå®ãããé·ãã«ãã¦ã親ã¯ã©ã¹ã®
// ã³ã³ã¹ãã©ã¯ã¿ã¼ãå¼ã³åºãã¦ãã¾ãã
super(length, length);
// ã¡ã¢: æ´¾çã¯ã©ã¹ã§ã¯ã`this` ã使ç¨ããåã« `super()` ãå¼ã³åºã
// å¿
è¦ãããã¾ãããããçç¥ãã㨠ReferenceError ãçºçãã¾ãã
this.name = "Square";
}
get area() {
return this.height * this.width;
}
set area(value) {
this.height = value ** 0.5;
this.width = value ** 0.5;
}
}
ç°ãªããããã¿ã¤ãã«ãã¤ã³ããããã³ã³ã¹ãã©ã¯ã¿ã¼ã§ã® super ãå¼ã³åºã
super() ã¯ç¾å¨ã®ã¯ã©ã¹ã®ãããã¿ã¤ãã§ããã³ã³ã¹ãã©ã¯ã¿ã¼ãå¼ã³åºãã¾ããç¾å¨ã®ã¯ã©ã¹ã®ãããã¿ã¤ãã夿´ããå ´åã super() ã¯æ°ãããããã¿ã¤ãã®ã³ã³ã¹ãã©ã¯ã¿ã¼ãå¼ã³åºãã¾ããç¾å¨ã®ã¯ã©ã¹ã® prototype ããããã£ã夿´ãã¦ãã super() ãå¼ã³åºãã³ã³ã¹ãã©ã¯ã¿ã¼ã«ã¯å½±é¿ãã¾ããã
class Polygon {
constructor() {
this.name = "Polygon";
}
}
class Rectangle {
constructor() {
this.name = "Rectangle";
}
}
class Square extends Polygon {
constructor() {
super();
}
}
// Polygon ã®ä»£ããã«ï¼åºæ¬ã¯ã©ã¹ã§ããï¼ Rectangle ãç¶æ¿ããããã«ãã
Object.setPrototypeOf(Square, Rectangle);
const newInstance = new Square();
// newInstance ã¯ã¾ã Polygon ã®ã¤ã³ã¹ã¿ã³ã¹ã§ãã
// Square.prototype ã®ãããã¿ã¤ãã夿´ãã¦ããªãã®ã§ã
// newInstance ã®ãããã¿ã¤ããã§ã¼ã³ã¯ä»¥ä¸ã®ã¾ã¾ã§ãã
// newInstance --> Square.prototype --> Polygon.prototype
console.log(newInstance instanceof Polygon); // true
console.log(newInstance instanceof Rectangle); // false
// ãã ãã super() ã¯ã³ã³ã¹ãã©ã¯ã¿ã¼ã¨ã㦠Rectangle ãå¼ã³åºãããã
// newInstance ã® name ããããã£ã¯ Rectangle ã®ãã¸ãã¯ã§åæåããã¾ãã
console.log(newInstance.name); // Rectangle
仿§æ¸
| Specification |
|---|
| ECMAScript® 2026 Language Specification > # sec-static-semantics-constructormethod > |