• 締切済み

prototypeという予約後について

prototype プロトタイプ・キーワード。オブジェクトにプロパティを追加するときに使用する。 とのことですが、以下の2つは異なるのでしょうか? (1)---------------- var M = function(){}; M.val = 1; ------------------- (2)---------------- var M = function(){}; M.prototype.val = 1; ------------------- どう違うのかヒントください。

みんなの回答

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.2

「prototype」は予約語でも、狭義のキーワードでもありません。 「prototype」オブジェクト自体には何の特別な意味もありません。 ただ2つ重要な点があって、 1つは関数が生成されるときに自動的に作られること。 もう1つはnew演算子内で利用されることです。 new演算子は適応された関数の「prototype」プロパティをプロトタイプとしたオブジェクトを生成し、関数にthisとして渡す作業をするものです。 したがって、「prototype」オブジェクトに定義されたプロパティは、その関数に対しnew演算子を適応して生成される新しいオブジェクトのプロトタイプのプロパティになる。 つまりは新しいオブジェクトが継承してくれるものになるわけです。 対してただ関数にプロパティを定義しただけでは、それはただ関数オブジェクトのプロパティとしてあるだけで、特に特別な利用をされることはありません。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.1

こんなふうに違う。 (1)---------------- var M = function(){}; M.val = 1; var objM = new M(); alert(objM.val); //==>undefined ------------------- (2)---------------- var M = function(){}; M.prototype.val = 1; var objM = new M(); alert(objM.val); //==>1 -------------------

関連するQ&A

  • prototypeについて

    this,prototypeを使ったメソッドの定義について質問します。 ●thisを使う場合 function SomeObject(){ ・・・・・・・・ this.f = function(){ ・・・・・ } } ●prototypeを使う場合 function SomeObject(){ ・・・・・・・・ } SomeObject.prototype.f = function(){ ・・・・・・・・ } カスタムオブジェクトのメソッドをthisキーワードを使わず、prototypeで定義する利点はどのようなことでしょうか。thisキーワードとprototypeの使い分けが分からなくて質問しました。よろしくお願いします。

  • prototype の使い方

    prototype プロパティについて勉強しているのですが、次のような使い方で正しいのでしょうか。 var Dog = function() { this.sit = "I am sitting."; } var myDog = new Dog(); alert(myDog.sit); //“I am sitting.”と表示される。 var Dog2 = function() {} Dog2.prototype.sit = new Dog().sit; var myDog2 = new Dog2(); alert(myDog2.sit); //“I am sitting.”と表示される。 prototype の行で new Dog() を作るとゴミが出る気がするのですが、勝手に解放されるのでしょうか。

  • Array.prototype は使用しない方がいい?

    prototypeの有名な問題にobjentオブジェクト汚染、Arrayオブジェクト汚染があると思います。 - 現在ブラウザに実装されているJavaScriptにはforEachがない - forEachの代替としてfor~inが使われている - for~in はオブジェクトのプロパティを列挙する - forEachの代替としてfor~inが使われる事を考慮して、object.prototype は使用すべきではない Object オブジェクトの prototype に便利メソッドを放り込むのはやめて頂きたい - nazonoDiary http://d.hatena.ne.jp/nazoking/20050425/1114374966 for...in - MDC https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Statements/for...in この理屈はわかります。 一方、Array.prototype はなぜ使用してはいけないのでしょうか? ---- // 数値添字配列 Array.prototype.test=function(){ return 'test'; }; var arr = [1,3,5,7,9]; for(var i=0,l=arr.length; i<l; i++){ console.info(arr[i]); // コンソール出力(要Firebug) } // オブジェクト (連想配列ではない) Array.prototype.test=function(){ return 'test'; }; var arr = { a:1,b:3,c:5,d:7,e:9 }; for(var i in test){ console.info(test[i]); // コンソール出力(要Firebug) } ---- どちらも問題なく動作します。 問題が発生するとすれば「数値添字配列でfor~inを使用するケース」ですが、それは実装が誤っていると思います。 for~inはオブジェクトのプロパティを列挙する仕組みなので、prototypeで拡張したプロパティまで列挙されるのは自然な動作です。 私はこれを「for~inバグ」と呼ばれることに違和感を覚えるのですが…。 「数値添字配列でfor~inを使用するライブラリがとても多いから、Array.prototype は止めよう」ということなのでしょうか? JavaScript の Array オブジェクトを汚染させずに拡張してみる - Cyokodog::Diary http://d.hatena.ne.jp/cyokodog/20081031/ArrayExtend01

  • プロトタイプの関数から、別のプロトタイプの関数を呼出すには?

    javascript初心者ですが、オブジェクトに関してわからないことがあるので、教えてください。(とんちんかんな質問かもしれませんが、ご容赦下さい。) 下記のような場合、関数calから関数setを呼出すのはどうすればよいのでしょうか? function Obj(){ } Obj.prototype.set = function(){ } Obj.prototype.cal = function(){ ここから、setを呼出すにはどうすればよいのでしょうか? } var obj = new Obj();

  • prototypeで前の値を潰さない方法は?

    function obj() { this.name = "名前です"; } var obj01 = new obj(); alert(obj.name); というコードの場合、obj.nameでobj関数に設定されたnameプロパティの値「名前です」をアラートすることができます。このobj関数を変更せず、あとからプロパティと値を追加したい場合、prototypeメソッド(って言って間違いありませんか?)を用いて以下のように実現することができます。 function obj() { this.name = "名前です"; } obj.prototype.age = "年齢です"; var obj01 = new obj(); alert(obj.name+" / "+obj.age); newする前に記述するのがポイントなんですよね。これにより、obj関数(オブジェクト)にageというプロパティと値「年齢です」が追加され、アラートできるようになりました。また最近、連想配列を使うことで複数のプロパティと値を一気にセットできる便利な方法を発見しました。 function obj() { this.name = "名前です"; } obj.prototype.age = "年齢です"; obj.prototype = { "country":"日本出身です", "city":"東京出身です", "hobby":"音楽鑑賞です" }; var obj01 = new obj(); alert(obj.country+" / "+obj.city+" / "+obj.hobby); //alert(obj.age); //alert(obj.name); と、このように複数のプロパティと値をセットし、後で利用することができます。 前置きが長くてすみません、ここからが質問です。 最後の例の場合、連想配列によってセットされたプロパティの値は存在しますが、それ以前にprototypeで設定したageプロパティは存在しなくなっています。alert(obj.age)の行をコメントアウトしていますが、実行するとundefinedと表示されます。そして2つ目のコメントアウト行alert(obj.name);は問題なくnameプロパティの値をアラートできています。 つまり、prototypeメソッドを使って先に追加したプロパティと値は、「obj.prototype=連想配列」で実行した時点で潰されてしまっているようでした。 この連想配列を使ったプロパティ追加を行う際、先に「obj.prototype.プロパティ名」で追加していたプロパティと値を残しておく方法はありませんでしょうか?

  • コンストラクタとプロトタイプについて

    ネットで検索したりして調べているのですがいまいちわからなかった箇所が あるので質問させていただきます。 コンストラクタで設定するのとプロトタイプで設定する違いがいまいちわかりません。 例えば function Test { this.prop = hoge; } Test.prototype.prop1 = hogehoge; の場合 コンストラクタのほうが優先されてhogeがでるのはわかるのですが 下記の場合はプロタイプのほうが優先されてhogehogeと出てしまうのは どうしてでしょうか? <script language="javascript"> <!-- //コンストラクタ function Test(){alert("hoge"); } //prototypeでセット Test.prototype=alert("hogehoge"); //オブジェクト作成 var TEST = new Test(); window.onload=TEST; --> </script>

  • トリッキーなJSの文法(prototype.jsなど)が分かりません

    Ajaxの「prototype」( http://www.prototypejs.org/ )などで 下記のようなfunctionの記述方法をよく見かけます。 ▼Prototype.js(ver1.5.0) 20行目抜粋 ---------------------------------------- var Class = {  create: function() {   return function() {    this.initialize.apply(this, arguments);   }  } } -------------------------------------------- でも、私には高度すぎて以下の点がどうしても読み解けません。  (1)var Class = {~~~~~~} が、何をしているのか分かりません。    配列なら[ ]ですし関数か何かを省略した宣言の記述方法なのでしょうか?  (2)create: が何なのか分かりません。必死で調べたら型を宣言しているような感じでしたが、    見慣れない「:」を使ったプログラムで検討もつきません。 私が知っているfunction宣言はこの2パターンのみしか知りません。 ・一般的なfunction宣言  function test(hikisu){   //処理内容  } ・無名関数でのfunction宣言  var a = function(x) {   //処理内容  } ぜひ教えていただけませんでしょうか。 どうぞよろしくお願いします。

  • JavaScript プロトタイプについて

    ●質問の主旨 下記のコードを書くとエラーとして、 TypeError: Cannot set property 'totalPrice' of undefined が返されます。なぜでしょうか?原因が分かりません。 個人的には、このコードで、totalPriceメソッドを定義しているつもりなのですが…。 お詳しい方がいらっしゃいましたら、ご教示願います。 ●コード function Menu(name, price) { this.name = name; this.price = price; } var hamburger = new Menu("ハンバーガー", 100); hamburger.prototype.totalPrice = function(quantity) { return this.price * quantity; } var cheeseburger = new Menu("チーズバーガー", 120); cheeseburger.prototype.totalPrice = function(quantity) { return this.price * quantity; } output("太郎は、" + hamburger.name + "を" + hamburger.totalPrice(5) + "円分買いました。"); output("二郎は、" + cheeseburger.name + "を" + cheeseburger.totalPrice(3) + "円分買いました。"); ●元ネタ CodeStudy Javascript 4.プロトタイプ その3 http://jeek.jp/study/section21/4

  • setTimeoutのthis参照について

    prototypeメソッドの中でsetTimeout関数を使用したところ、thisで自身の関数を参照しなくなりました。setTimeoutの挙動についてぐぐってみたのですが、いまいちsetTimeoutを使用したときのスムーズな記述方法がわかりません。 ******************************** var hoge=function(){ this.myName="ほげ"; } hoge.prototype={ init:function(){ setTimeout(function(){ hoge.prototype.displayName(); // ★(1)setTimeout関数の中でのメソッドの適した呼び出し方は? // ↑の記述でも呼び出せるけど、間違ってる気がする。。 },1000) }, displayName:function(){ // ★(2)ここでhogeオブジェクトのmyNameプロパティを参照するにはどう記述すれば良いのか? //console.log(this.myName); //↑setTimeoutを使ったのでthis参照はwindowオブジェクトになっているから違う //console.log(hoge.myName); →undefinedを返す } } window.onload=function(){ var a=new hoge(); a.init(); } ******************************** 上記のようなprototype関数を使用したときのスムーズな記述方法を教えていただけませんでしょうか。 知りたいのは下記2点です。 ★(1)prototypeメソッドを使用したとき、setTimeout関数の中でのメソッドの適した呼び出し方は? ★(2)setTimeout関数内で呼び出したメソッドから、自身のオブジェクトのプロパティを参照するにはどう記述すれば良いのか? 初心者なので説明が下手だったり、質問内容で間違った記述があるかもしれません。 質問内容で問題がありましたらご指摘いただけると助かります。

  • js プロトタイプ

    javascriptソースコード <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>サンプル</title> </head> <body> <script type="text/javascript" src="jquery-1.7.2.min.js"></script> <script src="fastclick.js"></script> <script> function print(str){ document.write(str + "<br />"); } function Car(manufact, name){ this.manufact = manufact; this.name = name; } Car.prototype.info = function(){return this.manufact + " " + this.name;}; document.write("<p>"); var car1 = new Car("Toyota", "PRIUS"); print(car1.info()); var car2 = new Car("Honda", "INSIGHT"); print(car2.info()); document.write("</p>"); </script> </body> </html> 23行目なのですが「 Car.prototype.info 」とありますがjsにおいてプロトタイプはオブジェクトだという事は認識しておりますがプロトタイプを宣言する意味は何があるのでしょうか? 参考urlです。 http://www.ajaxtower.jp/js/function_class/index3.html

専門家に質問してみよう