過去ログ表示


過去ログ 173 を表示

トピック内全 7 記事中の 1 〜 7 番目を表示
[ 最新記事及び返信フォームをトピックトップへ ]
このトピックの全ページ / [0]

Function.prototypeの動作について
(#27097) このトピック中1番目の投稿
(環境: WinXP SP2/Netscape4)

Firefoxを使っていますが、日が浅くてどこに投稿したらいいのかよく分からないのでここに投稿させて下さい。
[背景]
現在、XULアプリケーションを作っていますが、prototype.js[http://prototype.conio.net/]を使おうとするとエラーが出ます。
prototype.js 内で Function.prototype の定義がされているのですが、エラー内容から、その部分が有効になってないのが原因と思って次の実験をしてみました。
[実験]
<script>
Function.prototype.bind = function() {}
function test() {}
for (var i in test) alert(i);
</script>
このようなスクリプトを HTML、XUL 形式で実行してみると、HTML の場合は bind と出ますが、XULの場合には出ません。
この結果から、XULでは Function.prototype の定義は無効と思われます。
[質問]
XUL において Function.prototype の定義が無効になるようですが、これは仕様なのでしょうか?それともバグなのでしょうか?
(もしくは、私の実験が不適切だったのでしょうか?)

Re[1]: Function.prototypeの動作について
(#27100) このトピック中2番目の投稿
(環境: Win2000/seamonkey1.0a)

> 現在、XULアプリケーションを作っていますが、prototype.js[http://prototype.conio.net/]を使おうとするとエラーが出ます。
> prototype.js 内で Function.prototype の定義がされているのですが、エラー内容から、その部分が有効になってないのが原因と思って次の実験をしてみました。
> [実験]
> <script>
> Function.prototype.bind = function() {}
> function test() {}
> for (var i in test) alert(i);
> </script>
> このようなスクリプトを HTML、XUL 形式で実行してみると、HTML の場合は bind と出ますが、XULの場合には出ません。
> この結果から、XULでは Function.prototype の定義は無効と思われます。
> [質問]
> XUL において Function.prototype の定義が無効になるようですが、これは仕様なのでしょうか?それともバグなのでしょうか?
> (もしくは、私の実験が不適切だったのでしょうか?)

「XUL形式で実行」とは、どのようなことを指しているのでしょうか。

HTMLファイルの中の<script>の中で行った「Function.prototype.bind=...」が、XULの中で使用するfunctionには適用されない、ということならば、それはごく自然なことである、と思えます。
XULの中で使用するfunctionに対するprototype.js内でのfunction.prototype.bindの定義、というのは、どこでどのようにして定義しているものを指しているのですか?

なお、for (... in )で、オブジェクトの全てのプロパティーを見ようとした場合、一部のプロパティーでセッター・ゲッターなどがきちんと定義されていず、エラーになる場合があります。
これは、
obj=window.document ;
for (var xx in obj) {
try { obj_txt = String(obj[xx]) ; }
catch(e) { obj_txt = "( String Error occurred!!! ) " + xx ; }
}
というような形でひっかけて、エラーをバイパスする必要がでてきますので、ご注意を。
document.domConfigでは今でもこのエラーがでます(documentオブジェクトでは、これだけみたいですけど)。

Re[2]: Function.prototypeの動作について
(#27194) このトピック中3番目の投稿
(環境: WinXP SP2/Netscape4)

resありがとうございます。

>「XUL形式で実行」とは、どのようなことを指しているのでしょうか。
出来るだけ短く、と思い最低限通じるだろうコードを提示したのですが、うまく通じなかったようですみません。
実際には次のようなコードを、test.xul等と保存してfirefoxで直接表示させて検証していました。
<?xml version="1.0"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript">
Function.prototype.bind = function() {}
function test() {}
for (var i in test) alert(i);
</script>
</window>

例えば、
Object.prototype.test = function(){alert('object')}
var a = {};
a.test();// ←objectとalertが出る。
Function.prototype.test = function(){alert('function')}
function dummy(){};
dummy.test();// ←htmlに書いて実行するとfunctionとalertが出るが、xulに書くとtest()が無いとエラーが出る。
というコードを実行した場合、「Object」の prototype 自体に test メソッドが加わり新しく作られた Object は全て test メソッドが使えるようになる、と理解しています。
これと同じ様に、Function.prototype にメソッドを新たに追加してみると、全ての Function で新たなメソッドを利用出来る、という事を期待していました。

今回の問題は、この Function.prototype で新たに追加したメソッドが XUL において利用出来ない、という事です。

※prototype.jsは Javascript のライブラリで、function の拡張として、上記のような方法を使って新たに bind()、bindAsEventListener() というメソッドを追加しているのですが、XUL 上で使用すると bind()、bindAsEventListener() が定義されていないとエラーが出るのです。

Re[3]: Function.prototypeの動作について
(#27208) このトピック中4番目の投稿
(環境: Win2000/seamonkey1.0a)

2005/12/01(Thu) 12:59:46 編集(投稿者)

> >「XUL形式で実行」とは、どのようなことを指しているのでしょうか。
> 実際には次のようなコードを、test.xul等と保存してfirefoxで直接表示させて検証していました。
> (中略)
> これと同じ様に、Function.prototype にメソッドを新たに追加してみると、全ての Function で新たなメソッドを利用出来る、という事を期待していました。

それだと、E4Xの話、になりますよね。
HTML でのスクリプトは、ECMA-262(ECMAScript Language Specification 3rd edition)で定義されていて、Mozilla系では「JavaScript」として実装されていて(今はJavaScript 1.5、Firefox 1.5ではJavaScript 1.6のはず)、「ECMA Scriptの拡張」になっていますが、
XULでのほうは、ECMA-357(ECMAScript for XML (E4X) Specification)になります。

(Q1)仕様で明らかに可能であると書いてあるのに、FirefoxだとXULの場合にそれができない、ということですか?
(Q2)実際にFirefoxのテーマとか機能拡張として実行した場合にはどうなりますか?
こちらの場合は、E4Xではなく、「ECMA Script v3 + JavaScript 1.5(or 1.6)での拡張・変更」で実行されると思うんですが...

仕様書の中を読んでいないのでわからないままで書いていますが、仕様あるいは実装が、ECMA-262/JavaScript連合とECMA-357では異なる、ということは、あっても不思議はないように思えます。
E4Xでは、宣言された時にできるfunctionオブジェクトが、Functionというコンストラクターを通じて定義されているわけではない、と考えると、HTMLの時とXULの時で違ってくることも、一応解釈できます。
(HTML/JavaScriptの時に、FunctionDeclarationで宣言されているのに、Functionというコンストラクターを通じて作られた時と同じようにprototypeが有効になることのほうが、なんで?!、っていう感じ...)
E4Xのサポートはまだできてから日が浅いし、単に、functionオブジェクトの場合にprototypeを見に行っていない「バグ」、ということも充分にあり得ますけどね(^^;

Re[4]: Function.prototypeの動作について
(#27217) このトピック中5番目の投稿
(環境: Win2000/Firefox1.6a)

No27208に返信(Wadaさんの記事)
これじゃないですかね。
https://bugzilla.mozilla.org/show_bug.cgi?id=300079

(以下余談)
> それだと、E4Xの話、になりますよね。
E4X は関係ないでしょ。Fx 1.5 の場合、XUL でも HTML でも使われる JavaScript は ECMA-262-3 + E4X + SpiderMonkey Only の拡張(__proto__ とか) です。

Re[5]: Function.prototypeの動作について
(#27221) このトピック中6番目の投稿
(環境: Win2000/seamonkey1.0a)

> これじゃないですかね。
> https://bugzilla.mozilla.org/show_bug.cgi?id=300079

ビンゴ! 全く同じ現象ですね。

wmさん、問題は明確で確実に再現するようですし、本家のバグ番号も明らかですから、問題が簡単に確認できるテストケースをつけて、「ばぐじら」に「バグ」を開いてはいかがですか?

>>それだと、E4Xの話、になりますよね。
> E4X は関係ないでしょ。Fx 1.5 の場合、XUL でも HTML でも使われる JavaScript は ECMA-262-3 + E4X + SpiderMonkey Only の拡張(__proto__ とか) です。

あ、そうなんですか。ECMA-263とは独立してECMA-357が存在する、と思い込んでました(^^;
# ECMA-357に全然目を通していないのが、バレバレ(^^;
で、http://developer.mozilla.org/ をちょっと見てみたら、JavaScript 1.6の新機能は「E4XとArray Extra」、と書いてありました。
これで、また一つ利口になった... m(__)m

Re[6]: Function.prototypeの動作について
(#27252) このトピック中7番目の投稿
(環境: WinXP SP2/Netscape4)

>Fooさん
resありがとうございます。
英語が苦手なので詳しい所までは理解出来ませんでしたが、どうやら同じ事を言っているようですね。
一応、自分でも調べてみた積もりだったのですが、よく考えると bugzilla-jp しか見ておりませんでした^^;
実の所、解決にもっと時間がかかるものだと思っていたので、すごく助かりました。

>Wadaさん
resありがとうございます。
bugzilla を使うのは初めてだし、実の所、bugzilla も bugzilla-jp も同じ物(?)だと思い込んでいたので本家にあればいいかな?と思ったのですが、折角だし報告しておきました。(Bug 4828)

お二人の助言で色々勉強させていただきました。
ありがとうございました。
済!

このトピックの全ページ / [0]

返信不可


- Child Tree -