57
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

constructorプロパティについて

Last updated at Posted at 2012-11-28

オブジェクトの初期化で使用されたコンストラクタ関数を参照するconstructorプロパティ。
constructorプロパティはコンストラクタのprototypeのプロパティであり、インスタンスからはprototypeを通じてアクセスすることができる。
コンストラクタのprototypeにプロパティ/メソッドを追加する方法によってconstructorプロパティに入る値が変わるので注意。

1,コンストラクタのconstructorプロパティが削除される

function ClassA(){};
ClassA.prototype = {
    say : function(){}
};

var a = new ClassA();
console.log(a.constructor); // Object

ClassA.prototypeに新しいオブジェクトを代入するとClassAのprototypeがconstructorプロパティごと上書きされ、constructorプロパティにはプロトタイプチェーンを遡りObjectが入る。

2,コンストラクタのconstructorプロパティが保持される

function ClassB(){};
ClassB.prototype.say = function(){};

var b = new ClassB();
console.log(b.constructor); //ClassB

新しいオブジェクトを代入せず、ClassB.prototypeに直接プロパティ/メソッドを定義する方法であればClassBのconstructorプロパティが保持される

3,constructorプロパティを直接定義する

function ClassC(){};
ClassC.prototype = {
    say : function(){},
    constructor : ClassC
};

var c = new ClassC();
console.log(c.constructor); //ClassC
for(var p in c){
    console.log(p); //consructorが列挙される
}

ClassC.prototypeに新しいオブジェクトを代入し、その中でconstructorプロパティを定義し値をClassCとすればconstructorプロパティを設定できるが、constructorプロパティがfor-inで列挙されてしまう。

4,constructorプロパティを直接定義する方法で、for-in時に列挙されないようにする

function ClassD(){};
ClassD.prototype = {
    say : function(){}
};
Object.defineProperty(ClassD.prototype, 'constructor', {
    value : ClassD,
    enumerable : false
});

var d = new ClassD();
console.log(d.constructor); //ClassD
for(var p in d){
    console.log(p); //consructorが列挙されない
}

ECMA-262 5th editionで導入されているObject.definePropertyを使用してfor-in時に列挙されないようenumerableの値をfalseにする

雑感

普段あまり意識しないconstructorプロパティ。
使いどころもそんなに無いと思うけどクラス生成メソッド等を作る時は意識するようにしないと。
個人的にはシンプルに「2」で良いかなと思うけど、prototypeっていちいち書くのがめんどくさければ即時関数に入れちゃう方法もある。

function ClassE(){}
(function(p){
    p.say = function(){};
})(ClassE.prototype);

var e = new ClassE();
console.log(e.constructor); //ClassE
57
50
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
57
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?