実際にクラスを作成せずに、eggという名前のオブジェクトを作成しただけではありませんか。
それは正しい。そこで行っているのは、ベースオブジェクトをインスタンス化することだけです。インスタンスをObject
作成できるものは何も作成していません。
JavaScriptには、クラスの形式化された概念はありません。関数を呼び出すのではなく、インスタンス化することによって実現される、クラスのシミュレーションだけがあります。
function Animal() { this.animal = true; }
Animal.prototype.sayHi = function() { alert(this.name+' says hi!'); }
function Dog(name) { this.name = name; }
Dog.prototype = new Animal();
...
var fido = new Dog('Fido');
fido.sayHi(); //"Fido says hi!";
4行目は、継承をシミュレートするいくつかの手段の1つにすぎないことに注意してください。
したがって、JavaScriptでは、クラスと関数はどちらも単なる関数です。インスタンス化を目的とした関数がnew
オペレーターなしで呼び出されるのを防ぐための固有の機能はなく、その逆もありません。
前者の場合、一般的な回避策は、コンストラクターが「クラス」であることを確認し(呼び出されてインスタンス化されていない場合、コンストラクターはインスタンス化されますObject
)、必要に応じて再ルーティングします。
function Dog(name) {
//if we weren't instantiated, the constructor will be Object, not Dog
if(this.constructor != Dog) return new Dog(name);
this.name = name;
}
var fido = Dog(); //bad - invocation should be instantiation