3

私は JavaScript を勉強していて、そのオブジェクトの概念と混同しています。私はかつて Java プログラマーでしたが、JavaScript にクラスがないことに恐怖を感じています。これまでに学んだことから、関数は JavaScript のクラスを置き換えることができます。new以下のように ' ' キーワードを使用して関数をインスタンス化できます。

function person() {
    var name;
    this.tellYourName = function() {
        return 'My name is ' + name;
    }
    this.setName = function(newName) {
        name = newName;
    }
}

var person1 = new person();

person1.setName('Chris');
alert(person1.tellYourName());

上記のコードでは、person 関数からプロパティを継承するオブジェクト「person1」を作成しました。

だからここに私の質問があります。person() はオブジェクトですか? オブジェクトとperson()は、クラスかインスタンス化されたオブジェクトかということです。

閉鎖について勉強していたとき、私はこの概念に混乱していました。サンプルコードはこちら

function closureTest(a) {
    return function(b) {
        return a + b;
    }
}

var test = closureTest(1);
alert(test(2));

ここで、closureTest 関数はクラスではなくメソッドとして機能すると思います。行は ' ' キーワードをvar test = closureTest(1);使用しませんでした。newつまり、テスト変数は からの戻り値を格納しますが、closureTest(1);ご覧のとおり、テスト変数は のオブジェクトとして使用されますclosureTest。これはどのように可能ですか?以下のテストコードで試してみたので

function test(a) {
    return a;
}
var t = test(2);
alert(t);

期待どおりにテスト関数の戻り値を出力します。

私の質問があまり混乱しないことを願っています。私は現在 Java から JavaScript に移行しましたが、ほぼ同じになるという私の考えはすべて間違っています。JavaScript のオブジェクトの概念に関するいくつかの講義を読みましたが、さらに混乱します。これを読んでくれてありがとう。あなたから何かを得られることを願っています:)

4

5 に答える 5

3

いくつかの理論的な観察:)

オブジェクトがクラスのインスタンス化であるという概念は、JavaScript を理解する上で非常に役に立ちません。JavaScript には、古典的な継承ではなく、プロトタイプの継承が含まれます。つまり、オブジェクトは継承チェーンの上位にある他のオブジェクトからプロパティを継承しますが、クラスからは継承しません。

まず、関数は JavaScript のオブジェクトです。これは、関数がメソッドを持つことができることを意味します。

new次に、プレフィックスを指定して関数を呼び出すと、新しいオブジェクトが作成されます。この新しいオブジェクトは関数のプロトタイプにリンクされますがthis、新しいオブジェクトを参照します。で使用するように設計された関数newは と呼ばれconstructorsます。

第三に、同じことを達成するためのさまざまな方法があります。だからあなたはこれを行うことができます:

// The capital for the function indicates a constructor function
function Person(name) {
    this.name = name;
}
Person.prototype.tellYourName = function() {
    return 'My name is ' + this.name;
};
Person.prototype.changeName = function(newName) {
    this.name = newName;
};    
var person1 = new person("Chris"),
    random_string = person1.tellYourName(); // Chris

または、 を使用せずに同じことを達成することもできますnew

function person(name) {
    // myName is a private variable
    var myName = name; // This line is actually unnecessary if you use name throughout

    return {
        // Public methods
        tellYourName: function() {
            return 'My name is ' + myName;
        },
        setName: function(newName) {
            myName = newName;
        }
    }
}
var person1 = person("Chris"); // Note that `new` is not used

後者は、それに伴うデータの隠蔽のため、通常好まれます。つまり、プロパティを取得する唯一の方法nameは、パブリック メソッドを使用することです。

于 2013-08-04T06:23:55.150 に答える
2

まずは新しいキーワードから。このように考えてください:this関数本体の個人関数で保存したものはすべて、新しいインスタンスが作成されるときに渡されます。したがって、 new Person() が返さthisれ、設定した関数は何でもthis

2 番目の問題については、別の関数を返す関数と考えてください。オブジェクトではなく、関数を返しています。関数は技術的にはオブジェクトです。したがって、 を呼び出すとclosuretest(1)、基本的に返されます

var test=  function(b) {
    return 1+b;
 }

したがって、test(2) を呼び出すと、 return 1+2 =3 になります。

それが役立つことを願っています

于 2013-08-04T06:14:48.463 に答える
0

上記の例は、2 つの異なる使用例です。JavaScriptでは、あらゆるものがオブジェクトとして扱われます。関数に new キーワードを使用していた場合、関数オブジェクトはクラスとして扱われ、これで参照される変数はクラスのプロパティです。

var Person = function(){
    this.name = null;
    this.age = 0;
};

これは、クラスPersonのインスタンス/オブジェクトで使用できるプロパティとして名前と年齢を持つPersonクラスとして扱われ、オブジェクトは次のように作成されます。

var someone = new Person();
//someone.name and someone.age are valid then.

ただし、関数内でこれを使用しない場合、クラスとして作成されないため、使用可能な別のオブジェクト/関数を返す example2 に示すように、通常の関数として機能します。この問題の詳細については、オブジェクト指向の JavaScriptと、このトピックに関するその他のリンクを参照してください。

于 2013-08-04T06:25:10.930 に答える
0

newJavaScript で「 」キーワードを使用すると、いくつかのステップが実行されます。まず、提供された関数のプロトタイプを使用してオブジェクトの新しいインスタンスを作成します。あなたの場合は人です。2番目のステップは、新しく作成されたオブジェクトの境界付きコンテキストで提供された関数を呼び出すことです。最後のステップは、新しく作成されたオブジェクトを返すことです。したがって、オブジェクト作成の魔法はすべてnewオペレーターにあります。ここでそれについて読むことができます

于 2013-08-04T06:28:35.287 に答える