0

Javascript でクラス (またはオブジェクト) を作成する方法は、次を使用することです。

function MyObj()
{
    this.someVar = "xyz";
    this.someMethod = function(){}
}

私の簡単な質問は、この関数が通常の JavaScript 関数とどのように異なるかということです...たとえば、2 つの数値を加算する関数とは?

4

3 に答える 3

3

機能は変わりません。違いを生むのは、それらをどのように呼ぶかです。

たとえば、それらは同じ効果があります:

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();

質問にというタグを付けたので、関数を構築する最良の方法は次のとおりであると言って完了します。

function MyObj(){
    this.someVar = "xyz";
}
MyObj.prototype.someMethod = function(){
    console.log(this.someVar);
}
var obj = new MyObj();
obj.someMethod();

このように、 のすべてのインスタンスはMyObj同じ機能を共有するため、より軽量になります。

于 2013-03-21T09:38:16.353 に答える
1

違いは関数の内容ではなく、呼び出し方にあります。

を呼び出すとvar myObj = new MyObj()、新しいオブジェクトが作成されます。慣例により、このような使用を意図した関数は大文字で始まります。

キーワードなしで関数を呼び出すと、関数new内でまったく同じことが起こりthisますが、新しく作成されたオブジェクトではなくグローバル オブジェクトになります。これは、単純な「2 つの数値を加算する」機能では問題になりませんが、忘れると非常に奇妙なバグが発生する可能性があります。

呼び出しを忘れても問題にならないようにする 1 つの方法newは、これを関数の先頭に置くことです。

function MyObj() {
     if (! (this instanceof MyObj)) {
         return new MyObj();
     }
     ...
}
于 2013-03-21T09:43:02.943 に答える
1

なし。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"
于 2013-03-21T09:46:22.707 に答える