1

関数を使用してオブジェクトを作成したいObject.create(プロトタイプなし、最初の引数をnullとして)。

プロパティがJavaScriptのオブジェクトの状態を決定し、JavaScriptには3種類のプロパティがあることをどこかで読みました。

  • 名前付きデータのプロパティ
  • 名前付きアクセサプロパティ
  • 内部プロパティ

したがって、オブジェクトで関数を定義するときは、常にそれをnamed accessor property:として定義する必要があります。

var obj = Object.create(null, {   
     a:{
        get:function(){
           alert('jQuery nyan!');          
        }
     }
});​

または、関数がaでもaでもnamed data propertyない場合に、関数をaとして定義する必要がありますか?[たとえば、DOMobjに変更を加えるいくつかのjQuery関数] settergetter

var obj = Object.create(null, {
     a:{
        value:function(){
              alert('jQuery nyan!');          
        }
     }
});​

どのアプローチを取るべきですか?パフォーマンス(速度)とメモリ管理の点で、違いはありますか?どちらも例外なく機能しているようです。

obj.a;
//output: 'jQuery nyan!'
4

2 に答える 2

1

互換性を気にしない場合は、getterandを使用してs とssettersを置き換える良いアプローチになる可能性があります。また、関数バージョンと比較して、パフォーマンスの大幅な向上/低下はありませんsetNAME()getNAME()

関数を呼び出すのではなく、変数にアクセスしているように見えるため、getter/setterこの期待に応えるには関数を非常に軽量にする必要があることに注意してください。

また、jQuery のように getter と setter の両方に1 つの関数を使用しないでください。非常に遅いだけです。JavaScript には関数シグネチャがないため、これをシミュレートするとif/elseパフォーマンスが大幅に低下します。

于 2012-12-05T03:59:49.153 に答える
1

それらを参照しやすくするために、次のように定義しましょう。

var objA = Object.create(null, {a: {get:  function(){alert('jQuery nyan!');}}});
var objB = Object.create(null, {a: {value:function(){alert('jQuery nyan!');}}});

現在、の使用を除いて、objA.avsの呼び出しにほとんど違いはありません。objB.a()()

ただし、いくつかの違いがあります。主な違いは、パラメーターを getter に渡すことができず、そのまま呼び出されることです。これはobjA.a(1,2,3)、引数を使用して関数を呼び出さないことを意味します1, 2, 3ゲッターが関数を返さないと仮定すると、実際には呼び出しにエラーがスローされます(実際に実行しようとしています)。undefined(1,2,3)

2 番目の違いは、 の 2 番目のパラメーターが、フラグ(デフォルトはfalse ) を含む記述子Object.createのオブジェクトを取ることを覚えておく必要があります。ここでの違いは、「プロパティはアクセサーを持ち、書き込み可能または値を持つことができない」ため、設定できないことです。これは、getter のメソッドを変更したい場合は、プロパティを再定義する必要があることを意味しますが、については、プロパティに関連付けられたメソッドを変更するために を使用できるようにすることができます。writablewritable:trueobjA.a=

さらに、with no setterobjA.a = <expr>はまったくアクションを実行しません。

通常、ゲッターとセッターは次のインスタンスでのみ使用し、valueそれ以外の場合は標準の動作として使用します。

  • 軽量計算出力
  • 入力の検証 (オブジェクトを保護するため)
  • 直接アクセスから変数を隠す
  • 変数名またはプロパティ名が変更される可能性がある標準 API を維持する
于 2012-12-05T03:46:10.643 に答える