javascriptのthisについて
なんだかすごくわからなくなってしまった><
function A(){ this.str = "hoge"; B(); } function B(){ console.log(this.str); } B(); -> undefined おkおk A(); -> hoge ! B(); -> hoge !!?? delete A; B(); -> hoge !!!???
わけ分かりません
Function.applyの個人的な解釈
よく分からん
Netscape Communicator 4.06 以降では、call() や apply() を用いて、Person のサブクラス Person2 や Person3 を作成することができます。引数固定の場合は call()、可変個引数の場合は apply() を用います。
クラスを継承する
クラスを継承?よく分からん(´・ω・`)
難しいので三つに分けて考える (以下関数A == F:A)
1.関数間で引数を引き継ぐ
例えばF:AとF:Bってのがあったとして
F:Aに渡された引数を全部F:Bに渡したいって時は・・・
function A(){ return B.apply(this,arguments); } function B(){ var w = null; for(var i=0;i<arguments.length;i++)w += arguments[i]; return w; } var res = A(1,2,3,4,5,6,7,8,9); console.log(res); -> 45
この様になります
つまりB.apply(this,arguments)はB(arguments[0],arguments[1],arguments[3],......)
と同じ意味になります
2.相手関数のthisをセットする
普通Function.applyはFunction.apply(this,arguments)の様に使いますが
この第一引数がセットする内容になっています・・・たぶん・・・
例えば
function A(){ this.str = "hoge"; this.value = "foo"; return B.apply(this,arguments); } function B(){ var w = null; for(var i=0;i<arguments.length;i++)w += arguments[i]; return this.str+"|"+w+"|"+this.value; } var res = A(1,2,3,4,5,6,7,8,9); console.log(res) -> hoge|45|foo
こんな感じです
B.apply(this,arguments)のthisはF:Aのthisなので
F:AのthisがF:Bにthisにセットされたのが分かると思います
またthisじゃなくてもObjectとかJSONでも同じようなことができます
function A(){ var h = {str:"foo",value:"bar"}; return B.apply(h,arguments); } function B(){ var w = null; for(var i=0;i<arguments.length;i++)w += arguments[i]; return this.str+"|"+w+"|"+this.value; } var res = A(1,2,3,4,5,6,7,8,9); console.log(res) -> foo|45|bar
ちなみにB.apply(null,arguments)やB.apply(undefined,arguments)でも同じ結果になります(なんで?)
3.相手関数からthisを受ける
applyは相手関数のthisをセットできますが受けることもできます
例えば
function A(){ B.apply(this,arguments); } function B(){ for(var i=0;i<arguments.length;i++)this[i] = arguments[i]; } var res = new A("hoge","foo","bar","baz"); console.log(res[0]+"|"+res[2]); -> hoge|bar
ただしこの様に書いてしまうと・・・
function A(){ var h = {str:"hoge",value:"foo"}; B.apply(h,arguments); } function B(){ for(var i=0;i<arguments.length;i++)this[i] = arguments[i]; } var res = new A("hoge","foo","bar","baz"); console.log(res[0]+"|"+res[2]); -> undefined|undefined
このようになってしまいます
なぜかというと相手関数のthisを受けるのはapplyの第一引数だからです
ですからこのようにObjectやJSONを使う場合はこう書いたほうが良さそうです
function A(){ var h = {str:"hoge",value:"foo"}; B.apply(h,arguments); return h; } function B(){ for(var i=0;i<arguments.length;i++)this[i] = arguments[i]; } var res = A("hoge","foo","bar","baz"); console.log(res[0]+"|"+res[2]); -> hoge|bar
結局applyって
関数間で引数とかthisをいろいろやりとりできる関数ってことかな?
はてなTIPS - アドレスから「id naoya」でダイアリーに - Firefoxとか用
d:id:naoya:20040907を見て「これすげー便利だな!!」って思ってたんだけど
IEあんまり使わないしFirefoxでできないものかな〜といろいろ検索してたらd:id:urx:20051212にすばりの方法が書いてあった
作り方
1.まず適当なページ(GoogleとかYahooとか)をブックマーク
2.「ブックマーク(B)」から今作ったブックマークを右クリック→「プロパティ(R)」を開く
3.下の様にしておく
名前 | URL | キーワード |
---|---|---|
hatena(適当に) | http://d.hatena.ne.jp/%s | id |
使い方
アドレスバーに「id hogehoge」って入れるだけ
http://d.hatena.ne.jp/naoya/に行きたければ「id naoya」、
http://d.hatena.ne.jp/amachang/に行きたければ「id amachang」といった具合です
他にもいろいろ
名前 | URL | キーワード | |
---|---|---|---|
Google検索 | http://www.google.co.jp/search?q=%s | g | |
名前 | URL | キーワード | |
Yahoo検索 | yahoo | http://search.yahoo.co.jp/search?p=%s | y |
キーワードだけで使う方法もある
名前 | URL | キーワード | |
---|---|---|---|
はてブ | hatebu | http://b.hatena.ne.jp/ | hatebu |
名前 | URL | キーワード | |
404 Blog Not Found | 404 | http://blog.livedoor.jp/dankogai/ | 404 |
名前 | URL | キーワード | |
ニコニコ動画 | nico | http://www.nicovideo.jp/ | nico |
名前 | URL | キーワード | |
Youtube | you | http://jp.youtube.com/ | you |
右クリックするやつはこうだ!
d:id:Hetaru:20080212:1202799927を見て「これだっ!」と思ったので書いてみました
window.onload = function (){ var image = document.getElementsByTagName("img"); for(var i=0,l=image.length;i<l;i++){ image[i].oncontextmenu = function (){ this.src = "http://www.dan.co.jp/~dankogai/dan-180x240.png"; this.width = 180; this.height = 240; return false; } } }
右クリックしたらこうなるぞ!!
書き込みテスト
テストテスト