3

私は古典的なOOPのバックグラウンドからJavascriptに来ており、プロトタイプを理解するのに問題があります。

以下のコード例を考えてみましょう。

  1. fooでbarを呼び出す/実行するにはどうすればよいですか?
  2. プロトタイプに配置する代わりに、なぜ「特権」関数を使用するのですか?
  3. これはおそらくQ1で答えられますが、bar1とbar2はお互いに呼び出すことができますか?

    function foo()
        {
           this.property = "I'm a property";
    
           this.privileged = function()
           {
              // do stuff
           }
        }
    
        foo.prototype.bar = function()
        {
           // do stuff
        }
    
        foo.prototype.bar2 = function()
        {
           // stuff
        }
    
4

4 に答える 4

4

これについては、今日まで多くのFUDがあります。

1)。簡単な使用法:

var xxx = new foo();  // Create instance of object.
xxx.privileged();  // Calls the internal closure.
xxx.bar();  // First looks for internals, then looks to the prototype object.

2)。これにより、基本的に、インスタンスでのみ変更できるクロージャが作成されます。プライベートではなく(オブジェクトインスタンスを介して何でも通信できるため)、オブジェクトの各インスタンスが関数の新しいコピーを取得する関数の個別のコピーです。関数自体を変更することはできますが、グローバルに変更することはできません。私は物を作るこの方法の大ファンではありません。

3)。はい:

foo.prototype.bar = function(){
    this.bar2();
}

foo.prototype.bar2 = function(){
    this.bar();
}
// Although... NEVER do both.  You'll wind up in a circular chain.

啓蒙のために、私はあなたに物事がどのように呼ばれるかを示すのに役立つはずのフィドルを作りました:http: //jsfiddle.net/7Y5QK/

于 2012-06-29T12:21:31.950 に答える
2

1)Clyde Loboの答えとして、最初はいくつかあります。

var f = new foo();
f.bar();

2)consturctor(特権)に関数を記述します。すべてのインスタンスが新しい関数を作成します。でメソッドが定義されている場合、すべてのインスタンスは同じのメソッドprototypeを共有します。prototype

var f1 = new foo(), // instance 1
    f2 = new foo(); // instance 2

f1.privileged === f2. privileged // -> false , every instance has different function
f1.bar === f2.bar // -> true, every instance share the some function

3)this.bar() `を呼び出すことができます、次のようなコードbar2bar' by

function foo() {
   this.property = "I'm a property";

   this.privileged = function() {
      // do stuff
   };
}

foo.prototype.bar = function() { // defined a method bar
    alert('bar called');
    this.bar2(); // call bar2
};

foo.prototype.bar2 = function() { // defined a method bar2
    alert('bar2 called');
};

var f = new foo();
f.bar(); // alert 'bar called' and 'bar2 called'
f.bar2(); // alert 'bar2 called'
于 2012-06-29T12:35:14.403 に答える
1
  1. を実行することでfooでbarを実行できますが、を使用してオブジェクトを継承しているthis.bar(); 場合にのみ機能します。それ以外の場合は、を呼び出すだけで、グローバルオブジェクトを指します。new foo();foofoo();this

  2. これは基本的に同じことですが、関数内で継承オブジェクトに指定するプロパティとメソッドだけが、に渡す引数にアクセスできますfoo

  3. はい、関数は「吊り上げられている」ので、お互いに呼び出すことができます。それらは、最も近い外部スコープ内のすべての変数とオブジェクト、および機能コンテキストにアクセスできます。

実際には、コードに構文エラーがあります。プロトタイプを割り当てる場所では、関数を作成しませんでした。あなたが意味した:

foo.prototype.bar = function() { /* ... */ };
于 2012-06-29T11:53:17.853 に答える
0

1.次のようなfooのインスタンスを作成できます

var f = new foo();

その後、電話f.bar()してf.bar2()

ポイント2と3はすでにDavidによって説明されています

于 2012-06-29T12:06:10.390 に答える