トップページ⇒tech
175コメント68KB

JavaScript JScriptってどうよ

■ このスレッドは過去ログ倉庫に格納されています
0001Mr. JNGNG
ここでこっちへ逝くよう言われたのでこっちへ来てみました。
http://pc.2ch.net/test/read.cgi/win/1021566844/l50
JScript.Netなんてのもありますよね。
JScriptはブラウザのあるところならどこにでもあるので軽く知ってお
くと便利な気もするんですけど。


↓Windows スクリプト テクノロジのヘルプから引用

JScript
インターネット向けに特別に開発された Microsoft の強力な
スクリプト言語です。JScript.NET は Microsoft の ECMA
262 規格に準拠した次世代の言語です。ECMAScript Edition
4 と併せて現在開発が進められている JScript.NET では、完
全コンパイル済みコード、型付き変数および型なし変数、クラ
ス (継承、関数のオーバーロード、プロパティ アクセサなど)、
パッケージ、クロス言語のサポート、.NET Frameworks へのア
クセスなど、さまざまな改良が組み込まれています。


JavaScript関係の勉強ができる所
ttp://member.nifty.ne.jp/aya/
ttp://www.tokumaru.org/JavaScript/index.htm

Script Encoderの落とせる所
http://msdn.microsoft.com/downloads/default.asp?URL=/downloads/sample.asp?url=/msdn-files/027/001/789/msdncompositedoc.xml

Script Decoderの落とせる所(使ったことないです)
http://www.astalavista.com/hacking/win/scrdec.shtml
0002デフォルトの名無しさんNGNG
<XML>
 <SHINE>

  ,,,,,,,,,,,,,,,∧,,∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜′,,,,,,,,,,ミ,,゚Д゚彡<  Delphiばんざーい
 UU"""" U U    \_________

 </SHINE>
</XML>
0003デフォルトの名無しさんNGNG
プロトタイプ方式ってよくわからん...
0004デフォルトの名無しさんNGNG
JavaScriptは便利だね。
ブラウザで動作させられるし。
ファイルへのアクセスが出来ればもっと便利なんだけどな・・・
0005デフォルトの名無しさんNGNG
これってweb製作板ネタじゃないの?
0006デフォルトの名無しさんNGNG
Rhinoとか、ブラウザ非依存の処理系って知名度
ないよね...
0007デフォルトの名無しさんNGNG
JScriptってVBScriptも含んでるんだっけ?
0008Mr. JNGNG
>>2

ご存じないのかもしれませんけどJavaScriptはclassを定義で
きるんです。
例えばどこにいてもWeb上にclass群を置いておけば再利用きる
んです。(インターネットを利用できれば)
外部読みこみの"*.js"のファイルは関数を投げ込んでおくのに
しか使えないわけではないです。
0009デルパイ氏ね ◆VB6.V49. NGNG
VBScriptも扱え
0010Mr. JNGNG
>>4

ちゃんとできます。
ここにも書いてあるんですけど。
http://pc.2ch.net/test/read.cgi/win/1021566844/l50


//class Horse
function Horse(name, age, isMale){
this.name = name;
this.age = age;
this.isMale = isMale;
this.toString = HorseToString;
}

function HorseToString(){//Horse classのメンバ関数toString
var str = this.name + "は" + this.age + "歳(" + ((this.isMale) ? "オス" : "メス") + ")";
return str;
}

//class Zebra extends Horse
function Zebra(name, age, isMale, stripeCount){
//スーパークラスのコンストラクタ呼び出し
Horse.call(this, name, age, isMale);
//追加されたメンバ変数の初期化
this.stripeCount = stripeCount;
}
var h = new Horse("Bill", 4, true);
var z = new Zebra("Jane", 3, false, 382);
var fso, file, fileName;

fileName = "utuda.txt";
fso = new ActiveXObject("Scripting.FileSystemObject");
file = fso.createTextFile(fileName, true, false);

file.writeLine(h);
file.writeLine(z);
file.close();

new ActiveXObject("WScript.Shell").run(fileName);
//参照を解除してごみにする。
fso = file = null;
0011デフォルトの名無しさんNGNG
クラスがなんぼ作れたところで
単体ではファイルもビデオメモリも操作できない言語は
やはりマウスストーカーで終わり
0012Mr. JNGNG
>>5
classとか継承とか言い出すと範疇を外れてしまうんです。
JScriptはWebだけじゃなくてWSHとかHTAとかFLASHとかいろんな所で使えますから。
0013デフォルトの名無しさんNGNG
正直、JavascriptをWebとは関係なくローカルで
走らせるのってあんまメリットない気がする
(ある意味mozillaはすごい。). 実行系を
事実上標準装備しているのはWindowsだけだし、
Windows上でOSの各種サービスを使うならVBScriptの
ほうがしっくりくる。構文とかはVBScriptより
JScriptのほうが好きだけど。
0014Mr. JNGNG
>>9
VBScriptについて詳しくないですし、私の知っている範囲で
はVBScriptは変数とかオブジェクトの宣言と同時に初期化で
きないので面倒なことになります。
0015デフォルトの名無しさんNGNG
>>10
それどっちかというとWSHの力だよな。
JavaScript、JScript、JScript.NETを
WEBブラウザで使うのかWSHで使うのか.NET Framework上で使うのか
とかはっきりしないと中途半端なスレで終わるような気がするけど。
しかもWEBブラウザを対象にするなら板違いだし、
WSHなら他にスレあるけど盛り上がってないし。
0016デフォルトの名無しさんNGNG
まれにみる良スレ
でもsage
0017デフォルトの名無しさんNGNG
このスレはJScript.NETのスレになりました
0018hc2 morf ◆8XVajy8s NGNG
HSPスレを見る限りではJScript.NETの情報を求める声が多かった。
なぜHSPスレでJScript・・・?
0019デフォルトの名無しさんNGNG
ECMA262のレベルのオブジェクト指向のやり方って、クラス方式じゃ
なくて、プロトタイプ方式じゃないの?
>>10 のコードもぱっと見でそんな感じするんだけど。
JScriptでなんか構文の拡張とかあったの?
0020デフォルトの名無しさんNGNG
JavaScript > つまらん
JScript+WSH > 将来性なし+制限多し
JScript.NET > ウマー
0021Mr. JNGNG
>>13
Webとは関係なく走らせるんじゃなくてWebでもWSHでも
FLASHでもHTAでも再利用可能なオブジェクトを作成で
きるといいたいわけです。
0022デフォルトの名無しさんNGNG
>>19
Javaに近い構文のクラス定義が出来るようになったよ
0023デフォルトの名無しさんNGNG
>>21
無理だろ。
0024デフォルトの名無しさんNGNG
Win板のWSHスレで既出なんだけど、こういうスレにありがちな
「プログラムできました」とかいって全コードを載せるのは控えて欲しい。

http://pc.2ch.net/test/read.cgi/win/1009175619/964-965
0025デフォルトの名無しさんNGNG
>>24
ソース全く上げずに他言語攻撃するよりはまったりしていてよし。
0026Mr. JNGNG
>>15

WSHでなくてもclassは再利用できるんです。
ファイルの出入力を強調したいわけじゃなくてclassの再利用について強調したいんです。
>>10

を見てもらえばわかるようにクラスを作成してWeb上に置いておけば誰でも
いつでも再利用できるんです。
0027デフォルトの名無しさんNGNG
>>25
「全コード」って言ってるやん。
要は他の言語スレと同じ。要点まとめろと。
0028デフォルトの名無しさんNGNG
それなら
ActiveXコントロールのがまだいいや
(´∀` )
002919NGNG
>>22 ありがとう。そうか、仕様追加されたんだ。
うーん、でも >>10 のコードを見る限り ECMA262 のプロトタイプ
の範疇だと思うんだけど、JScriptで追加されたクラス定義の
やりかたを誰か教えてくれないでしょうか。
0030Mr. JNGNG
>>19
申し訳ないです。プロトタイプ方式というのを知りません。
0031デフォルトの名無しさんNGNG
>>29
http://www.microsoft.com/japan/msdn/columns/scripting/scripting07142000.asp

近いかな?ちゃんと読んでないけど。
0032デフォルトの名無しさんNGNG
// 関数を class ステートメント内にラップします。
class Car
{
// クラス メンバを宣言します。この例では型を使用しましたが、
// 使用しなくてもかまいません。クラスを 'expando' としてマークすれば、
// これらのメンバを宣言する必要はありません。
var make : String;
var color : String;
var year : int;

// 古いコンストラクタ関数はそのまま。
function Car(make, color, year)
{
this.make = make;
this.color = color;
this.year = year;
}

// 関数をクラス内に移動します。
function GetDescription()
{
return this.year + " " + this.color + " " + this.make;
}
}

// 新しい Car オブジェクトを作成して使用します。
var myCar = new Car("Accord", "Maroon", 1984);
print(myCar.GetDescription());


http://www.microsoft.com/japan/msdn/columns/scripting/scripting07142000.aspより

0033デフォルトの名無しさんNGNG
良かったな>>1。どうやら袋叩きには遭ってないようで。
0034デフォルトの名無しさんNGNG
>>33
割と望まれてる子だし。JS.NET。
0035デフォルトの名無しさんNGNG
VBScriptには未来はないということでよろしいか?
0036Mr. JNGNG
>>33
はじめはどうなるかとドキドキして必死でがんばりました。
0037デフォルトの名無しさんNGNG
>>35
これまでもあったのか?
0038デフォルトの名無しさんNGNG
>>35
VBScriptはMS製品の共通言語でしょ?
WordでもExcelでもASPでも使うし。
0039デフォルトの名無しさんNGNG
完全に絶たれた、ということで
0040デフォルトの名無しさんNGNG
VBAの方が深刻だと思われ。
中途半端に普及して・・・。
0041デフォルトの名無しさんNGNG
まだ気は抜くな。土日が待ってる。
0042デフォルトの名無しさんNGNG
なぜM$はこの期に及んでVB.NETなど出したのだろう・・・
0043デフォルトの名無しさんNGNG
>>42
旧VBプログラム(Notプログラマ)コンバータ。
0044デフォルトの名無しさんNGNG
スレ違いですよ>VBScript,VBA,VB.NET
0045デフォルトの名無しさんNGNG
なぜかVB系のSetステートメント好きだな
Set Object=object
ああこれぞオブジェクト
0046デフォルトの名無しさんNGNG
このスレでは何を話し合うつもりだ?>1
JavaScriptとJScript、JScript.NETの共通部分なんて微々たる物だし、
JavaScriptならWeb、JScriptならWSH、JScript.NETなら.NETそれぞれのスレに話が行くし
0047デフォルトの名無しさんNGNG
>>46
>JScript.NETなら.NET
逝かないから困ってるんですが?
0048デフォルトの名無しさんNGNG
>>46
せっかく良スレになってきてるのに沸いてくるなよ。
004919NGNG
>>32
ありがとう、そうか、classって識別子を導入したんだね。
>>30
クラス方式ってのはclass定義をあらかじめ行ってから
オブジェクトを生成するやり方。プロトタイプ方式は
オブジェクトを生成してから、あと付けでプロパティや
メソッドをがんがん追加していくやり方。
prototypeプロパティを使い始めるとクラスを使っていた
わけじゃないのが理解できると思う。
005019NGNG
http://blade.nagaokaut.ac.jp/~poffice/news2/fj.comp.lang.java/1489
を読むとわかるかも。それか、この人が書いた
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3871-3.html
か。
0051デフォルトの名無しさんNGNG
ま、需要があれば自ずからスレ伸びるよ。しばらく様子見たれ。
0052Mr. JNGNG
>>49
丁寧な解説ありがとうございます。実は、JavaScriptの勉強
をするのにJavaの本を買ったりして勉強したんです。という
かJavaScriptの解説本を読んでJavaScriptを理解できる人は
天才だと思います。なにしろ、いきなり関数の再起呼び出し
をやってるコードを示してVBより簡単とかいってますから。
普通new演算子が出てきた時点でJava本に走ると思います。
0053デフォルトの名無しさんNGNG
javaを一から勉強したいんだけど何かお勧めの本ない?
0054デフォルトの名無しさんNGNG
>>53
だからな、スレ違いなんだよ。
0055デフォルトの名無しさんNGNG
今現在
糞スレばかり上がってるな(´∀` )
0056Mr. JNGNG
>>46
オブジェクト指向の考え方は書いたコードをいかに効率的に再利
用するかという要請によって誕生したと理解しているので、
Web, WSH, FLASHなどで再利用できるとしたら結構素敵かと思って。
知ったらみんなちょっとうれしいかな。なんて考えただけです。
0057デフォルトの名無しさんNGNG
>>53
スレ違い。

>>52
JavaScriptの本ってほとんどWeb系の本ばっかりだから、
純粋に言語として扱っている本がないのは致命的。
誰か久野先生以外の本、知ってたら教えて下され。
0058デフォルトの名無しさんNGNG
> Web, WSH, FLASHなどで再利用できるとしたら結構素敵かと思って。
> 知ったらみんなちょっとうれしいかな。なんて考えただけです。

やっぱうれしがるのはWEB板の人かなぁなんて思うのよね…
0059Mr. JNGNG
>>53
Java言語プログラミングレッスン(上)(下)
参考としては
明解C言語入門
0060デフォルトの名無しさんNGNG
JavaScript,JScript等は、
ブラウザをフォームに見立てれば、立派なプログラミング言語だと思うが。
0061Mr. JNGNG
ごめん訂正。

Java言語プログラミングレッスン(上)(下)
結城 浩 (著)

参考としては
明解C言語 入門編
柴田 望洋 (著)
0062Mr. JNGNG
>>55
どこいきゃいいんだ?
0063デフォルトの名無しさんNGNG
>>62
フサギコと心中も一興
0064デフォルトの名無しさんNGNG
なんつーか、 1 が痛々しい。61なんて59,61なんて
周りの空気読めてないし。スレ違いだってみんなが指摘
しているのになぜ続けるか。再利用の話もうわっつら
な理解だけで言葉を並べているだけ。とりあえず、落ち着け。

Javascriptのスレがあること自体には反対しません。はい。
0065デフォルトの名無しさんNGNG
だからとりあえず落ち着いて様子見するべ。
需要があれば自ずから(略
0066デフォルトの名無しさんNGNG
Javaと混同するやつが後を絶たんのでオンリーJScriptスレにしてほしい。
0067デフォルトの名無しさんNGNG
1の母で…以下は省略されました
0068Mr. JNGNG
>>64


気が短くて申し訳ありません。

別に知識をひけらかしたくて参考文献を示したわけではないです。
ちょっとした皮肉のつもりでした。

JScriptは正規表現をサポートしておりWindows環境のあるところな
らどこでもつかえる便利な言語であると認識しています。Perlでい
いという人もいるでしょうけど普通Perlはサーバーよりの環境にし
か突っ込まれていません。それに、普通UNIXのあるところにしかな
いですしね。JScriptのほうが設置ベースが大きいのです。それに
会社のパソコンの管理なんかやるにしても開発環境が無料というの
は結構お得だと考えます。
0069デフォルトの名無しさんNGNG
でもPerlの方が使いやすいし、ただには変わりない。
つーかご高説は聞きたくない。実になる話をしてオクレ。
0070デフォルトの名無しさんNGNG
ミガデター━━━━━(゜∀゜)━━━━━━!!!! 
0071デフォルトの名無しさんNGNG
ローカルリソースへのアクセスが標準化されてないのはいたい。
WSHにしてもmozilla(rhino)にしてもそれぞれ独自のやり方でしか
ファイルアクセスできない。手軽に正規表現でテキスト処理できる
って感じじゃないんだよなぁ。だから常用のスクリプトにはしてないや。
使うのは、特定のファイルのコピーのやり方をメールで指示するときに
.jsファイルをメールに添付して「ダブルクリックしろ!」とかいうときくらいだ。
0072Mr. JNGNG
>>71
ですから、そういうことについて語ってほしかったわけです。
別に俺が教えてやるといっているわけじゃないんですから。
0073デフォルトの名無しさんNGNG
JavaScriptつーとこういうのもあるな。
http://sash.alphaworks.ibm.com/
http://www-124.ibm.com/developerworks/oss/sashxb/
007471NGNG
すまんが、72がなぜおれに絡んでくるのか、だれかわかりやすく
解説してくれんか? 理解できん。

>>73
IBMも処理系ネタ好きだよね。alphaworksみていると、それ業務で
やってんのかってのがいろいろあって楽しい。
0075デフォルトの名無しさんNGNG
>>74
皆にそういった話題をして欲しかったってことじゃないの?
絡んでるわけじゃないと思われ。

スレ終了に持って逝きたがる輩が多いからね。
0076Mr. JNGNG
>>74
申し訳ないです。あなたは別に煽ってもいませんし私の落ち度です。
ちょっと気が立ってました。反省してます。
0077デフォルトの名無しさんNGNG
JavaScriptのちょっとだけ濃い話
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/5042/

JavaScriptで圧縮とか暗号化とかしてみる
ttp://www.goice.co.jp/member/mo/amuse/javascript/expert/
0078デフォルトの名無しさんNGNG
JavaScript使用のサイト・リローダー

>リローダーっす。(悪用厳禁)
>http://www.hoops.livedoor.com/~himajin_ch/reloader.htm
0079デフォルトの名無しさんNGNG
参考に。

ECMAScript Language Specification, 3rd edition
http://www.ecma.ch/ecma1/STAND/ECMA-262.HTM

書籍で個人的によかったのは
「JavaScript第3版」David Flanagan(オライリー)
0080デフォルトの名無しさんNGNG
JavaScript、JScriptとJScript.NETって一緒くたにして語るべきもんなの?
0081デフォルトの名無しさんNGNG
>>80
Javascript + JScriptはともかくとして、
JS.NETは混同してはいけないだろう。

VBとVB.NETを同じスレで扱うようなもの。
0082デフォルトの名無しさんNGNG
>>81
何が問題かわからん
途中から説明してくれ
0083デフォルトの名無しさんNGNG
JScriptは気に入っている言語の一つではあるが、
本気でオブジェクト指向しようとすると記述がものすごく面倒なのがつらい。
tokumaru.netの継承サンプルとかすごいよ。

実用的なコードを出すとプラットフォーム依存になってしまうがそれでも良いか。
Flashは知らないし。

あとJScript.Net使うくらいならC#を使いたいところ。
VSAではC#使えないらしいので、JScript.Netも出番ありか。
0084デフォルトの名無しさんNGNG
それっぽいnewsgroup
ニュースサーバ msnews.microsoft.com
グループ名
 microsoft.public.dotnet.languages.jscript
 microsoft.public.dotnet.vsa
 microsoft.public.inetsdk.programming.scripting.jscript
 microsoft.public.scripting.jscript

compならcomp.lang.javascript
fjならfj.comp.lang.javascriptだが、ほぼ死んでいる。
0085デフォルトの名無しさんNGNG
こういう話がしたいのですかね?>>1
コピペして.jsで保存>cscript hoge.js

function hoge1(){
this.showName = showName;
function showName(){return "hoge1";}
function showName2(){return "hoge1_";}
}

function hoge2(){}
function hoge2_showName(){return "hoge2";}
hoge2.prototype.showName = hoge2_showName;

function hoge3(){}
function hoge3_showName(){return "hoge3";}
hoge3.showName = hoge3_showName;

WScript.Echo(new hoge1().showName());
WScript.Echo(new hoge2().showName());
WScript.Echo(hoge3.showName())

//以下はエラーになる
WScript.Echo(new hoge1().showName2());
WScript.Echo(new hoge3().showName());

0086Mr. JNGNG
>>10のコードをJavaでかくとこうなります。

class Horse{
    String name;
    int age;
    boolean isMale;
    
    Horse(String name, int age, boolean isMale){
        this.name = name;
        this.age = age;
        this.isMale = isMale;
    }
    
    public String toString(){
        return this.name + "は" + this.age + "歳";
    }
}

class Zebra extends Horse{
    int stripeCount;
    Zebra(String name, int age, boolean isMale, int stripeCount){
        super(name, age, isMale);
        this.stripeCount = stripeCount;
    }
    
    public static void main(String[] args){
        Horse h = new Horse("Bill", 4, true);
        Zebra z = new Zebra("Jane", 3, false, 382);
        System.out.println(h);
        System.out.println(z);
    }
}
0087Mr. JNGNG
ここからWindows Script Hostのヘルプを落とせます。
このヘルプはJScriptとVBScriptのランゲージリファレンスを含みます。
http://www.microsoft.com/japan/msdn/scripting/default.asp

昨日ここらを紹介しなかったのはまずかったと反省しています。
紹介すればもっと有意義な議論になったかもしれないのに。
0088デフォルトの名無しさんNGNG
だからスレの方向性をはっきりすれ。
Javaとか関係ないやん。
0089Mr. JNGNG
>>83
>>10のコードでHorseのメンバ関数であるtoString()は自動的に継承されていると思うんですけど。
FLASHは私も知りません。
0090デフォルトの名無しさんNGNG
(´ー`)。o○(1が率先してスレ違いの話をしてるのは何でだろう・・・)
0091Mr. JNGNG
>>88
JScriptはコンストラクタと関数の区別がはっきりしないんです。
>>10のコードでメンバ関数はfunction HorseToString()だけで
function Horseおよびfunction ZebraはJavaで言うところのコ
ンストラクタに相当するといいたいわけです。
0092デフォルトの名無しさんNGNG
>>91
それって誰か質問したんか?
「JScriptにコンストラクタはあるんですか?」とか。
なんだか>>1が講釈たれたくてageてるだけのスレに見えるんだよなぁ。
0093デフォルトの名無しさんNGNG
>>92
いや、その通りでしょ。
0094デフォルトの名無しさんNGNG
俺は正直、今までの内容ならWEB板、WSHスレのそれぞれで
やった方がいいと思うよ。
この板で新しく立てるなら「JScript.NET」に絞ったほうがいいと思う。
0095デフォルトの名無しさんNGNG
あとは「VC++(MFC限定)相談室」みたく「WSH(JScript限定)相談室」とかね。
WEBやFLASHで使えるって利点をアピールするのは正論だとは思うのだけど
やっぱWEB板の方がユーザも多いと思うし盛り上がると思うんだよね。
需要が無いのにage続けてるとうざがられるだけだし、
少しでも需要がある場所に行った方がよいと思う。
JavaScript、JScript、同.NETを一緒にして純粋に言語だけを語るのは
難しいんじゃないかなぁ。
しかも2chて質問するときに自分の環境を書くことなんてまず無いから
「それってJavaScriptの話?JScript?.NET?WSH使う?WEB?」
みたいな質問返しの応酬の予感。
0096デフォルトの名無しさんNGNG
個人的には w3m に JavaScript を激しく組み込むスレにしてほすぃ。
0097Mr. JNGNG
申し訳ない。
なんか利点を強調したくて焦点が絞れなかったみたい。
別に講釈をたれたかったわけじゃなくて、
JScriptで面白いことをやれたらいいなと思っただけ。
Javaを持ち出したのは、JavaScriptのオブジェクト指向的な部分は
Javaからのパクリだからというのと自分の説明の仕方が悪くてまと
もな議論になっていないように見えたので、ここの人にはJavaを持
ち出して説明したほうがよかったと反省したから。
自分がたまにJavaのライブラリから考え方をパクッて使ったりするので、
CLRからも考えをパクると面白いかと思って。
とりあえず、私の不徳のいたすところで皆さんに迷惑をかけました。
私的にはには終了ということにしたいです。
なにか苦情とかがあればお答えしますけど。
0098デフォルトの名無しさんNGNG
>>97
>JavaScriptのオブジェクト指向的な部分はJavaからのパクリだからというのと
ぜんぜん違うよ。上のほうでクラス方式とプロトタイプ方式
っていう分類を持ち出していた人いたように、Javascriptは
Javaに比べてもっと即興的なもの。Javaみたいなクラス方式?
は、オブジェクトの集団を分類するでしょ。つまりなにかの
オブジェクトは特定のクラスに属する。で、言語としても
それをサポートする構文規則が存在する。でもJavascriptには
それはないの。
たとえば、>>10 の
var h = new Horse("Bill", 4, true);
ってあるけど、結局これは、hというオブジェクトに対して
プロパティとメソッドを付け加えるためのfunctionにあとで
再利用できるためにHorseという名前が付いているだけ。
これをJavascriptでは、コンストラクタとよんでいるけど
Javaのそれとは意味が違う。だから、生成したあとの
h が、Horseクラスに属するとかそういう概念はないわけ。
共通のメソッドとプロパティを持っているオブジェクトの
集団は生成できるし、それをひっくるめることでJavascriptにおける
クラスの概念としても別にかまわんけど、構文規則として
それをサポートしているものはないの。だから、Horse functionと同じ
内容で違う名前のHorse1 functionってのが
あったとして、
new Horse("Bill", 4, true);
new Horse1("Bill", 4, true);
は見分けられない。Horse.call(this, name, age, isMale);
も単にHorseを使って新たなプロパティの追加を行っているだけ。
prototypeを使い始めるとわかるとおもうけど、あれも
クラスの継承とは違うんだよ。荒い言い方すると、
あるオブジェクトから、あるプロパティを取り出すときに
名前探索する範囲を他のオブジェクトが持っているプロパティ
まで広げられるってだけ。だからinstanceofみたいな
キーワードもあるけど、使い方はクラス方式とはぜんぜん違う。
#以上は、ECMA262 3ed.までの話だから、4ed.ではclassが...
#とかいう突っ込みはなしね。
みたいなことを理解しないと、Javascriptのオブジェクト指向
の話はできないよ。ってことでちょっと空回りしていた感も
あるんで、1はしばらく頭冷やすのがよいとおもわれ。1が自分で
いうように終了しろとまではいわんけどね。戻ってくるもよし、
そのまま立ち去るもよし。
0099デフォルトの名無しさんNGNG
Web関連はWeb板で、
WSHはhttp://pc.2ch.net/test/read.cgi/tech/1010400289/
があるから、ココはJScript.NETスレにして再利用すれば?
0100100NGNG
ひやく
0101デフォルトの名無しさんNGNG
>>99
.NETだと4ed.ベースになるみたいだし、スレタイからJavascriptは外したいとこ
だなぁ。.NET以外に実装し始めた処理系ってないよね?
とりあえず、このまま方向性決めずに放っておいて、.NETの話が多いなら
スレ立て直す、沈んでいくならそれもよし、Webネタ、WSHネタ
ばっかりだったら板違いってことでこのスレは沈めるってのは?
010299NGNG
>>101
そうだね。確かにこのスレタイだと苦しいかな。
とりあえず、流れに任すことにしますか。
0103デフォルトの名無しさんNGNG
壮絶な100レスだったな・・・
0104デフォルトの名無しさんNGNG
>>101
まぁ、なるようになるさ。それが2ch。
0105デフォルトの名無しさんNGNG
>>98
>var h = new Horse("Bill", 4, true);
>ってあるけど、結局これは、hというオブジェクトに対して
>プロパティとメソッドを付け加えるためのfunctionにあとで
>再利用できるためにHorseという名前が付いているだけ。
hというオブジェクトにHorseオブジェクトへのポインタを格納するんじゃないですか?
prototype方式の概念等は理解できます。
0106Mr. JNGNG
>>98
貴重な意見を語っていただいてうれしいです。勉強になりました。

とりあえず立ち去ることにします。皆さん、お騒がせしました<(_ _)>。
0107デフォルトの名無しさんNGNG
>>105
Horseオブジェクトって何よ
0108デフォルトの名無しさんNGNG
>>107
自作のオブジェクト
0109デフォルトの名無しさんNGNG
>>108
オブジェクトって言葉の使い方が怪しいが・・・

prototype方式にはC++などのようなクラスの概念はないの
> var h = new Horse("Bill", 4, true);
は h のさすオブジェクトの初期状態を決めるだけで
そのオブジェクトには好きなだけ新しいプロパティやメソッドを追加したり変更したりできる
0110デフォルトの名無しさんNGNG
CLOS のお勉強でもするといいかもね。
0111デフォルトの名無しさんNGNG
>>109
それはわかるです。
クラス方式でいうオブジェクトとかインスタンスとかじゃなくて、
JSのオブジェクトってことだったんです。

あと、CLOSもプロトタイプ方式なんですか?
0112 NGNG
0113デフォルトの名無しさんNGNG
ところでさ、JavaScript でクラスを書くときに
こういう書き方をしている人ってどれくらいいる?

function Hoge( a,b,c )
{
 // 非公開
 var m_a = a;
 var m_b = b;
 var privateFunction = function(){ .... }
 
 //公開
 this.c = c;
 this.getA = function(){ return m_a; }
 this.getB = function(){ return m_b; }
}

話題とずれてるので sage
0114デフォルトの名無しさんNGNG
プロトタイプ式オブジェクト指向の利点。
以下のように多重継承と、インターフェース実装を足して
2でわったような感じのコードが書ける

function A(a)
{
 var m_a = a;
 this.getA(){ return m_a; }
}

function B(b)
{
 var m_b = b;
 this.getB(){ return m_b; }
}

function Hoge( a, b )
{
 var m_key;
 var m_objA = new A(a);
 var m_objB = new B(b);
 for( m_key in m_objA ) this[m_key] = m_objA[m_key];
 for( m_key in m_objB ) this[m_key] = m_objB[m_key];
}

…無意味?
0115デフォルトの名無しさんNGNG
age
0116デフォルトの名無しさんNGNG
EcmaScriptのEdition3くらいの言語だと言語機能が少なくて、
簡単な事をやるにはいいけど、部品を拡張していく記述をするのに
手間が掛かるね。

あと、型無しの言語でいっぱいユーザー定義型を使ってると、
記述が不明瞭になってちょっと嫌だな。JScript.NETみたく、
EcmaScript Edition4っぽい拡張しても、記述が冗長な気がするし。

ま、いいか。(ぉぃ
0117デフォルトの名無しさんNGNG
>10
(゚∀゚)うぉっ
捜し求めていた情報がこんなところに・・・
0118ち ◆A2MadQ16 NGNG
去年末、JavaScriptでScheme(LISPの方言)を実装するという卒論を目撃。
0119デフォルトの名無しさんNGNG
>>113-114
ローカル変数がどう作用するかわかってそのコードを書いてる?
0120デフォルトの名無しさんNGNG
JavaScriptによる ジェネリックプログラミング
http://www.mamezou.com/tec/Tips/jsgl/
C++のテンプレートを移植してるっぽい。しょぼいけど。
0121113-1114NGNG
最初に >>114 の訂正。
×this.getA(){ return m_a; }
○this.getA = function(){ return m_a; }
Bも同じです…早く気づけよ>自分(鬱

>>119
たぶん114のことを言っていると思われるので。

えーと、Hoge は m_objA と m_objB の公開されてるメンバ(メソッドorプロパティ)と同じ
名前のメンバを作成し、そこに m_objAのメンバを代入すると思いましたが。
(故にメンバ名が被ると、上書きされる)
とはいえ、 Hoge の getA の中身が「function(){ return m_a; }」となっているところが
やや気にはなりますが、期待通りの動作をするので、
Hoge の getA は、実際は m_objA の getA を呼び出すという解釈をしているのですが。

見当外れのことを言っていたり、間違っていることを言っていたらご教授願います。
完璧に理解しているわけではないので…
0122厨房もじらーNGNG
function Hoge( a,b,c )
{
 // 非公開
 var m_a = a;
 var m_b = b;
 var privateFunction = function(){ .... }
 
 //公開
 this.c = c;
 this.getA = function(){ return m_a; }
 this.getB = function(){ return m_b; }
}
このコンストラクタを抜けた時点でローカル変数m_a, m_b, privateFunction
がスコープ外に抜けて無効になるような気がするけど
もしかして漏れの勘違いかな。。。
0123デフォルトの名無しさんNGNG
質問ですがconfirmの、「はい」「いいえ」で、デフォルトで「はい」が
選択されますが、それを「いいえ」にする方法ってあるのでしょうか?
0124デフォルトの名無しさんNGNG
>>122
プロトタイプ型のオブジェクト指向知らない俺ですが俺もそう思います。

初心者の質問から新たな議論が起こることもしばしばと言うことで解説して下さいな。
0125デフォルトの名無しさんNGNG
>>122
上のコード読んでみると違うっぽい。

多分function -> classに読み替えればスッキリするかと。
クラスの宣言とコンストラクタが同時に書けているんですな。
0126123NGNG
「はい」「いいえ」じゃなくて「OK」「キャンセル」ですね。
デフォルトで「キャンセル」が選択されている状態にしたいのですが、
調べてもなかなか出てこないもので。
0127デフォルトの名無しさんNGNG
>>114
質問、クラスAとクラスBに同名のメソッドなりフィールドがあった場合、前のメンバが隠匿されません?
単なる継承と理解。
0128113-114NGNG
>>122

var value = new Hoge( 10, 20 );

とした場合、value(空のObject) の this ポインタを Hoge に渡し、
Hoge のコンストラクタで value を初期化(※1)をしているので、
Hoge のコンストラクタが終了しても、value には影響を及ぼさないと。

だから、value のローカル変数は、value 自体がスコープを抜けて
クリアされるまで保持されるはず、と考えてるんだけど。
期待通りに動いているので、訊かれるまで考えもしなかったよ(^^;

※1
JScript の特徴として、実行前にすべての変数がチェックされ、その後初期化されるので
value に Hoge のメンバすべてが作成されたあと、Hoge のコードを上からたどっていって、
初期化されている部分があれば、value のメンバを初期化する考えているのだが。

0129113-114NGNG
>>114
ばっちり上書きされます。
しかも、A と B のローカル変数を Hoge は直接見ることが出来ないので、
継承といえるかどうかも微妙。
なんか、面白い使い方できないかなと思っただけなので。
0130113-114NGNG
↑
>>127 へのレスです。すいません(鬱
0131デフォルトの名無しさんNGNG
>>129
なるほど。
でも、プロトタイプ型って言うのもなかなか柔軟でおもしろそうですね。
勉強になりました。
0132デフォルトの名無しさんNGNG
WSHで.jsを実行すると毎回ノートンに警告されるんだけど
自分で作ったやつだけ素通りさせるにはどうしたらいいの?
0133128 の※1の続きNGNG
なので、

function Test(str)
{
 var m_s1 = str;
 var m_s2 = "test";
 var m_strJoin = join();
 var join = function(){ return m_s1+m_s2; }
 this.toString = function(){ return m_strJoin; }
}

は、エラーになってしまう訳です。
正常に動作させるには m_strJoin と join の順番を逆にしなければいけないと。
0134デフォルトの名無しさんNGNG
>>133
なるほど、手続き型プログラミングの原則1・順次を無視しちゃいけませんな。ってゴルァ!。
0135デフォルトの名無しさんNGNG
prototypeキーワード使わないの?
0136厨房もじらーNGNG
>>128
今試してみたらそうなった。
JavaScript(JScript)って奥が深いのね。。。
確かにnew Hoge(1,2)などと呼び出されるときのfunction Hoge()は
コンストラクタだから、関数のスコープで考えるのが間違いだったかも。
勉強になりました。ななしさんで書き込めばよかったと思ってます(鬱
0137119NGNG
>>121
その通りですよ。
問題は113の非公開と書いてあるところ。この変数はいわゆるクラススコープなので
この書き方は使い物にならない。やはりプロパティとして保持させるしかない。

>>122
ローカル変数も実は、あるオブジェクトのプロパティだったはず。常に実態はある。
もちろん直接はアクセスできないけど。

>>128
意味わからないです。どこからこういう話を聞いたのでしょうか。
var value = new Hoge( 10, 20 );
とした場合、Hoge のコンストラクタが実行され、オブジェクトが生成される。
そのオブジェクトへの"参照"が返され、value が初期化される。
んじゃなかった?

>>133
クラス型の言語と本質的に違うってまだわかってない?
function 文は、クラスの宣言じゃないんだから...
それと、>>133のコードは何をしようとしているのかわからないです。

var join = function(){...};
を
function join(){ return m_s1+m_s2; } ;
にしてみるとか...

「実行前にすべての変数がチェックされ」るのではなくて、実行前にすべての関数が
解釈されるのでこれ↑はできる。そういうことじゃないかな。

>>135
>>114のコードは prototype キーワードを使ってかけますよ。
0138137NGNG
実体っていう字間違えた。
あと、たくさん書き込んですみません。
0139137NGNG
また訂正
prototype キーワード→ prototype プロパティ
0140113-114NGNG

>>137

>クラススコープなので(中略)使い物にならない

JavaScript のクラスは「関数内関数」が進化(?)したものだと思っているので、
一層上の関数の変数が見えるのは当然だろうと考えています。
しかも、クラススコープなら余計問題なく使えると思いますが…

…すいません、ちょっと頭が混乱してきたので、
出来ればなぜ使い物にならないのか詳しく説明してもらえるとありがたいです。


>意味わからないです。どこからこういう話を聞いたのでしょうか。

意味がわからないというのは、多分私の文章力の無さです(^^;
で、私がそう思った根拠ですが、MSDN の JScript のリファレンスに
以下のようなことが書いてあったからです。(以下 MSDN Lib の new 演算子の説明より抜粋)

・メンバを持たないオブジェクトを作成します。
・オブジェクトのコンストラクタを呼び出し、
 新しく作成したオブジェクトへのポインタを this という名前でコンストラクタに渡します。
・コンストラクタは、受け取った引数に従って、オブジェクトを初期化します。

これを、自分なりに無い知恵絞って解釈した結果です。結構悩んだんですけど(^^;
何をどれに当てはめたらいいかで悩んだものですから。
0141140NGNG
続き

>クラス型の言語と本質的に違うってまだわかってない?
分かってます。
function は、関数オブジェクトを作成するためのステートメントですよね。
これを使用すると全く新しいオブジェクトが出来るので、これを拡張して
クラスっぽくやろうというのが、JavaScript のオブジェクト指向だと解釈しています。
それでも私はクラス型と同じように記述したいわけです。
そのほうが見やすいし、分かりやすいと思いませんか?

あと、133 のコードは、こうするとエラーだということを示すためだけの意味のないコードです。
おっしゃるとおり、var join = function を function join にすれば、何の問題もありません。
っていうか、すべてのコードに意味なんてありませんけど(^^;
0142140NGNG
ミス。
>>114 の継承の部分は、
this[key] = m_a.prototype[key]; (m_bも同じ)
でないとm_a[key]が toString や valueOf をもつ オブジェクトだった場合
期待通りの動きをしないかも。

あぁ、もう間違えだらけ。
混乱させてしまって申し訳ないです。
0143140NGNG
>>129
継承ではない。 Delegate(委譲) だ。
0144140NGNG
言い忘れていましたけど、
私の方法だと、スコープ外からのプロトタイプ継承が使えません。
あたりまえといえばあたりまえですが。
個人で完結したライブラリを作るときはあまり問題になりませんけど。

はっ!
ひょっとして、>>137 さんは、この問題を指摘していたのか!? (←気づくの遅すぎ。)


だらだらと書き込み重ねてすいません。そろそろやめます。
0145デフォルトの名無しさんNGNG
>>140
こんな感じですか?
function Man (n, a) {
//privateっぽい
var age = a;

//publicっぽい
this.name = n;
Man.prototype.setName = function (val) { this.name = val; };
Man.prototype.getName = function () { return this.name; };
Man.prototype.setAge = function (val) { age = val; };
Man.prototype.getAge = function () { return age; };
}

var mona = new Man("茂名","18");
var giko = new Man("擬古","19");
alert("mona の名前: " + mona.getName() );
alert("mona の歳: "+ mona.getAge() ); //上書きされてしまった

//(参考)すべてのメンバーを表示
var s="";
for (var i in mona)s+=i + " : " + mona[i] + "\n";
alert(s);


>>142
prototype と書かなくても大丈夫じゃないですか?

>>144
スコープ外からのプロトタイプ継承って?
継承するもののスコープは宣言された位置ですよ。
0146140NGNG
>>145
>prototype と書かなくても大丈夫じゃないですか?
そ、そのとおりです。っていうか書くとエラーが出ますね。(冷汗)
これからは、書き込むときはちゃんとコード書いて確かめてからにします。
すいません。

>スコープ外からのプロトタイプ継承って?
これは、私の書き方がまずかったです。
えーと、
 function A(a)
 {
  this.clac1 = function(b){ return a+b; }
 }
は、OKですけど、
 A.prototype.calc2 = function(b){ return a*b; }
は a がどこにあるか分からないので、エラーになると。そういうことです。
0147デフォルトの名無しさんNGNG
>>146
だから、その関数の実行スコープは、実行時ではなくて、定義時だということです。
0148140NGNG
>>147
そのとおりでした(^^;
0149デフォルトの名無しさんNGNG
マウスオーバーで別フレームのレイヤーに文字の表示をしようとしているのだけど、
どうやるのかしってますか? 同じフレーム内ならぜんぜんOKなんだけど。
0150デフォルトの名無しさんNGNG
>>149 そのあたりのブラウザ上でのクライアントサイドな話は
Web制作板に行くべきだと思う。
+ JavaScript の質問用スレッド vol.10 +
http://pc.2ch.net/test/read.cgi/hp/1022077876/l50
0151デフォルトの名無しさんNGNG
>>150
どうもありがとうです。
0152デフォルトの名無しさんNGNG
すいません、JavaScript の引数渡しに詳しい方にお聞きします。

function addMessageItem(arg){
 arg.push( "今日も一日頑張ってください" );
}
function changeMessageArray(arg){
 arg = new Array( "こんにちは", "ご機嫌いかがですか" );
}

という二つの関数があったとき、

objHello.msgArray = new Array( "おはようございます" );
var alias = objHello.msgArray;
addMessageItem(alias);

を実行すると、alias と objHello.msgArray の値は等しくなるのですが、

changeMessageArray(alias);

を実行しても、値に変化がありません。
Array は参照渡しなのに、どうしてこうなるのか全く分かりません。
なぜこうなるのかを教えてもらえないでしょうか?
0153デフォルトの名無しさんNGNG
>>152
チミは150を読んだのか?脊髄反射書込みするなよ。
0154デフォルトの名無しさんNGNG
じゃあageんなボケ。
0155デフォルトの名無しさんNGNG
152は150に該当するような話じゃないんじゃ
0156デフォルトの名無しさんNGNG
>>152
参照渡しじゃないよ。値渡し。
alias が持っている Array への参照が arg にコピーされるだけ。
0157デフォルトの名無しさんNGNG
>>152
ちゃんと参照渡しになっていますよ。
(arg == alias) // true
しかし、あなたのコードでは、参照という値を上書きしているだけです。
そのため、外部に何も影響を与えません。
参照で元の値を変更するならば、
arg.push(...) や arg.length = 0 などのようにしなければいけません。
0158デフォルトの名無しさんNGNG
>>155
結果的に参照が渡されるんだけどね。
0159デフォルトの名無しさんNGNG
>>157
ありがとうございました。

changeMessageArray(alias);
 or
changeMessageArray(objHello.msgArray);

と書いても、JavaScript だと objHello.msgArray は変わらないんですね。
Cとかやってると、このへんの仕様に悩まされます。
仕方が無いから、 changeMessageArray の最後に return arg; をつけて、

objHello.msgArray = changeMessageArray(objHello.msgArray);
alias = objHello.msgArray;

みたいな書き方をすることしました。
0160デフォルトの名無しさんNGNG
arg.length = 0;
arg[0] = "こんにちは";arg[1] = "ご機嫌いかがですか";
とかどうよ?
0161デフォルトの名無しさんNGNG
>>160
あ、その方法でもいけますね。
そっちのほうが、スマートにまとまりそうなので、そちらを使用します。
ありがとうございました。
0162デフォルトの名無しさんNGNG
ちょっと古いですが

>>128

> var value = new Hoge( 10, 20 );
> value のローカル変数は、value 自体がスコープを抜けて
> クリアされるまで保持されるはず、と考えてるんだけど。

valueのローカル変数というのはHoge関数のローカル変数だと思いますが。
そのローカル変数はvalueのプロパティなのではなく
むしろvalueのメソッド(となっているインライン関数)に属しているのだと思います。
つまり、Hoge()内でメソッドがインライン関数として定義されているため、
Hoge実行時の状況(ローカル変数や引数)がHoge関数を抜けてからも
メソッドから見える状態になってるんだと思います。

>>136
厨房もじらーさんは関数スコープで考えていいと思います。
関数内関数の事を知れば解決すると思います。
「kia's website」 (J(ava)Scriptメモ -> JavaScriptでクロージャ)
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/5042/
0163デフォルトの名無しさんNGNG
>>159
>Cとかやってると、このへんの仕様に悩まされます。

void f(int* a)
{
a = new int[1];
a[0] = 9;
}

void main()
{
int int_array[] = {1, 2, 3, 4, 5};
f(int_array);
// 多分int_arrayはそのまま
}

Cでも同じじゃないでしょうか。
0164デフォルトの名無しさんNGNG
new は無いんだった。
0165ELNGNG
age ついでにちょっと思いついたこと。
関数の完全なクローンを作成します。
継承にも使えます。

var inheritance = function cloning_function( newfuncname, basefuncname )
{
 var regexp = new RegExp( basefuncname );
 var funcvalue = new String();
 var exe = new String();

 eval( exe.concat("funcvalue = ",basefuncname,".toString();") );
 funcvalue = funcvalue.replace( regexp, "" );
 eval( exe.concat(newfuncname," = ",funcvalue) );
 
 exe = exe.concat( "for( var key in ", basefuncname, ".prototype )\n{\n" );
 exe = exe.concat( "\t", newfuncname,".prototype[key] = " );
 exe = exe.concat( basefuncname, ".prototype[key];\n", "}" );
 eval( exe );

 return newfuncname;
}

一応、JScript5.5 で動作確認しました。
0166ELNGNG
>>165
return newfuncname; は余計だった。
0167デフォルトの名無しさんNGNG
ふと思ったが、Java質問スレからこのスレにはリンク張られてないんだな。
0168デフォルトの名無しさんNGNG
>ふと思ったが、Java質問スレからこのスレにはリンク張られてないんだな。

            笑 え な い 発 言 で す
0169167NGNG
え、Javascriptの質問はWeb制作板へってのの話なんだけど。
0170167NGNG
あ、169の文がJavaスレの1に書いてあるのよ。で、みごとに
このスレむしされているなぁと。
0171デフォルトの名無しさんNGNG
だから?
0172デフォルトの名無しさんNGNG
http://www.suntory.co.jp/softdrink/dakara/
0173デフォルトの名無しさんNGNG
JavaScriptスレなんてあったんだ。って、JavaScriptスレだと
おもっていいよね。JScriptってよくしらんし。

なるべく JavaScriptには近寄らないようにしようと生きてきたんだけど、
最近仕事で使うので仕方なく ECMA262と O'Reillyのやつを読んでみた。
読んでみるとなかなか面白い言語であるな。
closureがあったり scope chainがあったり prototypeだったり。
そのくせ constructorなんてあって Java (C++?) への未練が断ち切れて
なかったり。好事家としての言語屋の知識欲をそそる仕様みたいだ。
でもやっぱりこんなのでコード書きたくないけどなあ。
0174デフォルトの名無しさんNGNG
>>173
>Java (C++?) への未練が
まぁ、JavaScriptの歴史から調べてみては?
0175デフォルトの名無しさんNGNG
『JavaScript 2 Black Book』
著者: Scott Duffy
出版予定: 2002年 12月
ttp://www.amazon.co.jp/exec/obidos/ASIN/1588803074/

JavaScript 2.0 と EMCAScript 4 についても書かれてるみたいですが、
12月までにEMCAScript 4が出るって事なのかな?
■ このスレッドは過去ログ倉庫に格納されています