Javascript でクラス (またはオブジェクト) を作成する方法は、次を使用することです。
function MyObj()
{
this.someVar = "xyz";
this.someMethod = function(){}
}
私の簡単な質問は、この関数が通常の JavaScript 関数とどのように異なるかということです...たとえば、2 つの数値を加算する関数とは?
Javascript でクラス (またはオブジェクト) を作成する方法は、次を使用することです。
function MyObj()
{
this.someVar = "xyz";
this.someMethod = function(){}
}
私の簡単な質問は、この関数が通常の JavaScript 関数とどのように異なるかということです...たとえば、2 つの数値を加算する関数とは?
機能は変わりません。違いを生むのは、それらをどのように呼ぶかです。
たとえば、それらは同じ効果があります:
function MyObj(){
this.someVar = "xyz";
this.someMethod = function(){
console.log(this.someVar);
}
}
var obj = new MyObj();
obj.someMethod();
と
function someMethod(){
console.log(this.someVar);
}
function MyObj(){
this.someVar = "xyz";
}
var obj = new MyObj();
someMethod.call(obj);
と
function someMethod(){
console.log(this.someVar);
}
function MyObj(){
this.someVar = "xyz";
}
var obj = new MyObj();
obj.f = someMethod;
obj.f();
質問にprototypal-inheritanceというタグを付けたので、関数を構築する最良の方法は次のとおりであると言って完了します。
function MyObj(){
this.someVar = "xyz";
}
MyObj.prototype.someMethod = function(){
console.log(this.someVar);
}
var obj = new MyObj();
obj.someMethod();
このように、 のすべてのインスタンスはMyObj
同じ機能を共有するため、より軽量になります。
違いは関数の内容ではなく、呼び出し方にあります。
を呼び出すとvar myObj = new MyObj()
、新しいオブジェクトが作成されます。慣例により、このような使用を意図した関数は大文字で始まります。
キーワードなしで関数を呼び出すと、関数new
内でまったく同じことが起こりthis
ますが、新しく作成されたオブジェクトではなくグローバル オブジェクトになります。これは、単純な「2 つの数値を加算する」機能では問題になりませんが、忘れると非常に奇妙なバグが発生する可能性があります。
呼び出しを忘れても問題にならないようにする 1 つの方法new
は、これを関数の先頭に置くことです。
function MyObj() {
if (! (this instanceof MyObj)) {
return new MyObj();
}
...
}
なし。new
大事なのはキーワードの使い方です。
ここを参照してください:
function Fun(){
this.method = function(){
return "Bar";
}
return "Foo";
}
var value = Fun(); // assigns the return value of Fun() to value
alert(value); // "Foo"
// alert(value.method()); // won't work because "Foo".method doesn't exist
var instance = new Fun(); // assigns a new instance of Fun() to instance
alert(instance); // [object Object]
alert(instance.method()); // "Bar"