3

Javascriptのこれら2つのステートメントに違いはありますか?

function p() {
    this.do = function(){alert('cool')};
}

そしてこれは?:

function p(){};

p.prototype.do = function(){alert('cool')};

もう1つ、なぜできないのですか:

function p(){};

p.do = function(){alert('cool')};

どうもありがとう!

4

2 に答える 2

3

p()最初の 2 つの例を考えると、コンストラクターとして呼び出すと仮定します。

  • 表面的には、それらは同じように動作します

しかし、最初の例は...

  • から作成された各オブジェクトに対して、新しい同一の関数を作成しますnew p()
  • p()[その関数] は、コンストラクター内のローカル変数とパラメーターにアクセスできます
//                                    p.prototype = {}
new p(); // { do:function(){alert('cool')}; } ------^
new p(); // { do:function(){alert('cool')}; } ------^
new p(); // { do:function(){alert('cool')}; } ------^

そして2番目の例...

  • から作成されたすべてのオブジェクト間で、プロトタイプに配置された関数を共有しますnew p()
  • [その関数] コンストラクターのプライベート変数/パラメーターにアクセスできません
//p.prototype = {do:function(){alert('cool')};}
new p(); // {} ------^
new p(); // {} ------^
new p(); // {} ------^

3 番目の例は機能しません。JavaScript では関数はオブジェクトなので、そのオブジェクトに新しいプロパティを配置するだけです。その関数の呼び出しには影響しません。

于 2011-08-20T22:48:22.843 に答える
0

機能的に言​​えば、それらは同じです。

最初のものは各オブジェクトの関数を定義しているためvar o = new p()、メモリの観点からは最適ではありません。

3番目の例で示していることはできますが、考えていることを達成することはできません:

function p(){};

p.do = function(){alert('cool')};

p.do(); // this will work

var o = new p(); // This won't have the 'do' function because that's not how it works in javascript.
于 2011-08-20T22:47:39.490 に答える