2016-12-18 9 views
5

のはThe Good Parts本からこの例を見てみましょう: 'Array.prototype'をいつ使うべきか、JavaScriptで 'this'を使うのはいつですか?

Array.method('unshift', function() { 
    this.splice.apply(this,[0,0].concat(Array.prototype.slice.apply(arguments))); 
    return this; 
}); 

はなぜ著者が、他の1つの場所で this.spliceArray.prototype.sliceを使用しましたか?

私はお互いにthisArray.prototypeをスワップアウトしようと、次のようなエラーを得た:

TypeError: Cannot read property 'slice' of undefined

が、私はまだthisまたはArray.prototypeを使用する必要がありますする際にどのように知って、わからないです。最初の呼び出しで

+1

非常関連など:のhttp:// stackoverflowの.com/q/7056925/476 – deceze

+0

この本は決してJavaScriptから始めるのには良い方法ではありませんでしたが、今は**古くなっています(ほとんど10年前)。より良い本を見つけることを強くお勧めします。 –

+0

@torazaburoしかし、私はこの本を、様々な情報源から推薦された本として読んだ後に選んだ。 –

答えて

8

thisunshiftが呼び出された配列を指し、それは、Array.prototypeからspliceを継承。 2番目の呼び出しで

は、しかし、コードがが配列(sliceメソッドを持たないarguments擬似アレイ)ない何かにsliceを使用します。その場合、CrockfordはArray.prototype経由でメソッドにアクセスしました。

技術的には、彼はこのように、第二の場所でthis.sliceを使用することもできました:

Array.method('unshift', function() { 
    this.splice.apply(this,[0,0].concat(this.slice.apply(arguments))); 
    return this; 
}); 

...しかし、2回目の呼び出しは、現在の配列が参照とは何の関係もありませんので、それはおそらく、誤解されているだろうby this

+0

@RajatSaxena:私の喜び。私は上記の誤解を招くようなものを削除しました(コードは 'splice'と' slice'を使用していますが、私のオリジナルの答えでは 'splice'を2回使用したと誤解していました)。 –

0

は、時にはあなたが多くの場合、我々は、インスタンスfooの作成時にfoo.bar === Foo.prototype.bar; // true

structure of prototypes

Fooのように設定されますコンストラクタのプロトタイプ性質を持っていることを実感して関係を可視化することが容易ですfoo__proto__)の特別な参照です。ここでは、fooに直接存在しないプロパティにアクセスしようとすると、そのプロパティが検索される次の場所が参照されます。

これは、あなたがfooは、そのオブジェクトからプロパティを隠すような方法で変更されていないことを期待するとき、本当にあなたはそれが同じものであるようfoo.barまたはFoo.prototype.barを経由して、ルックアップしようかどうかは関係ないことを意味します。あなたが見ることができるように

しかし、ないすべては同じ__proto__パスを持っていますので、あなたはobj.sliceは、例えば、存在することになると仮定しませんでした。あなたはArrayインスタンスを持っていない場合、これは意味がありますがスライスにしたいこと、あなたは、あなたが知っている方法が存在するがスライスを参照する必要があり、このようなArray.prototype.slice

関連する問題