🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

600閲覧

Objectではなく, あえてObject.prototypeに様々なメソッドなどを設定している理由

slimat

総合スコア57

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/12/04 09:49

編集2019/12/04 09:50

こんにちは.

以下のObject.prototypeのページを見ると, 以下の文があります.

たいていのオブジェクトは、プロパティを (メソッドを含み) Object.prototype から継承していますが、隠されている (つまり、上書きされている) こともあります。

この文の"〜継承しています"について質問があります.

質問 : "Objectオブジェクト"を継承しているオブジェクト達から利用されるメソッドがなぜ, あえてObjectではなく, Object.prototype. つまり, Objectのプロトタイプオブジェクトで定義されているのでしょうか?

宜しくお願い致します.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Object のメソッドは、クラスベースのプログラミング言語におけるスタティックメソッドやクラスメソッドなどと呼ばれるものに相当します。
Object.prototype のメソッドは、インスタンスメソッドや(単に)メソッドなどと呼ばれるものに相当します。

JavaScript における Object のメソッドと Object.prototype のメソッドは、クラスベースの言語におけるスタティックメソッドとインスタンスメソッドと同じくらい異なります。
ただ、これ以上の説明をしようと思うと明らかに質問の範疇を超えるので、あとはご自身で勉強してくださいとしか言えません。

投稿2019/12/04 10:23

2KOH

総合スコア999

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

slimat

2019/12/05 01:41

ご回答ありがとうございます. Objectはコンストラクタ関数(Function.prototypeを継承しているオブジェクト), Object.prototypeはFunction.prototypeを継承していないオブジェクトなので, 前者内で定義される関数はクラスメソッド, 後者内で定義される関数はインスタンスメソッドに近いと說明できるという理解で宜しいでしょうか.
2KOH

2019/12/05 03:02

その理解でだいたい合っていると思います。
slimat

2019/12/05 03:13

承知致しました. ありがとうございます.
slimat

2019/12/05 03:20

JavaScriptでは, コンストラクタの定義後にコンストラクタにプロパティを追加することはできないですが, クラスベースのプログラミング言語では, クラスの定義後にクラスにプロパティを追加するということは可能なのでしょうか?
shiracamus

2019/12/05 03:26 編集

Pythonではできます。 class Foo: pass Foo.value = 123 Foo.method = lambda self: self.value
slimat

2019/12/05 03:31

プログラミング言語で異なり, クラスベースで一括にはできないのですね. お教授ありがとうございました.
shiracamus

2019/12/05 04:19

一括とは? クラスベースは通常、classの中にクラス変数、インスタンス変数、クラスメソッド、インスタンスメソッドを一括で書きます。 後から追加できる言語もありますが、Javaのように後から追加できない言語もあります。
shiracamus

2019/12/05 04:20

> JavaScriptでは, コンストラクタの定義後にコンストラクタにプロパティを追加することはできないですが, やろうと思えばできます。 Foo = function () { this.instance_variable = 123; } Foo.prototype.__proto__ = { class_variable: "abc", class_method: function () { return this.class_variable; }, instance_method: function () { return this.instance_variable; }, }; f = new Foo(); console.log(f.class_method()); console.log(f.instance_method());
slimat

2019/12/05 07:47

shiracamus様の2019/12/05 12:26の投稿で, Pythonではクラスの定義後にクラスにプロパティを追加することは可能と書かれています.以下のページクラスベースの言語についての説明では, > クラス定義後に、そのクラスのプロパティの数や型を変更することはできません。 とあります. よって, Pythonでは既存のクラスのプロパティを変更することはできないが 追加はできるということなのでしょうか. https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Details_of_the_Object_Model 13:19の投稿に対する返答 : すみません. Pythonの例だけなのに, 2つ言語でご提示下さったように誤解していました. 一方, Javaは追加できないのですね.
shiracamus

2019/12/05 08:05

引用した直前の文が重要ですね。 > クラスベース言語では一般的にクラスをコンパイル時に生成し、コンパイル時または実行時にクラスのインスタンスを作成します。クラス定義後に、そのクラスのプロパティの数や型を変更することはできません。 PythonやRubyはJavaScript同様に動的変更可能です。 Javaはコンパイル時に決定するため、後から変更できません。
slimat

2019/12/05 08:14

動的に変更というのは, 実行中に変更できるかという話になるのでしょうか. それとも, 実行前のソースコード中のクラスの定義行より後の行で変更できるかの話なのでしょうか. あと, > クラスベース言語では一般的にクラスをコンパイル時に生成し、コンパイル時または実行時にクラスのインスタンスを作成します。クラス定義後に、そのクラスのプロパティの数や型を変更することはできません。 の, 一文目の"一般的"が2文目にも適用される文章と考えれば良かったということになるでしょうか.
shiracamus

2019/12/05 08:42

実行中に文字列からメソッドを作って追加したり削除したりもできますよ。 > 一文目の"一般的"が2文目にも適用される文章と考えれば良かったということになるでしょうか. そう思います。 一般的にはコンパイル時に型が固定されて、実行時に型を変更することができません。 静的型言語は、コンパイル時に厳しい型チェックをして、動作中に変な代入や型変換・型変更がおきないようにしてプログラムの堅牢性を高めています。 コンパイル不要のクラスベーススクリプト言語には動的型言語が多く、変数にはどんな型のオブジェクトでも代入できますし、型定義変更が柔軟にできる言語もある、ということになります。
slimat

2019/12/09 06:58

一般的にの話でしたか. 言語によってまちまちなのですね. ご返答ありがとうございました.
guest

0

Object.prototype. つまり, Objectのプロトタイプオブジェクトで定義されているのでしょうか?

こればっかりはそういう仕様だからとしか言いようがないですね

sample

javascript

1function hoge(x){ 2 this.x=x; 3} 4var y=new hoge(123); 5hoge.prototype.view=function(){console.log(this.x)}; 6y.view(); //結果:123 7var z=new hoge(456); 8z.view(); //結果:456

上記hogeに直接メソッドを追加できませんがprototypeを経由すればできます
またインスタンスyを指定したあとにprototype経由でメソッドを追加しても
インスタンスからメソッドが呼び出せます。

追記

prototypeを通さないとメソッドが追加されない

javascript

1function hoge(x){ 2 this.x=x; 3} 4var y=new hoge(123); 5hoge.view=function(){console.log(this.x)}; //エラー

インスタンス自体は拡張可能

javascript

1function hoge(x){ 2 this.x=x; 3} 4var y=new hoge(123); 5y.view=function(){console.log(this.x)}; 6y.view(); //結果:123 7var z=new hoge(456); 8z.view(); // エラー

インスタンスを拡張しても元のコンストラクタへは影響がないので
別のインスタンスから実行することはできない

投稿2019/12/04 09:55

編集2019/12/05 01:51
yambejp

総合スコア116694

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

slimat

2019/12/04 09:57

ご回答ありがとうございます. そうなのですね. 何か深い意味があるのかと考えてしまいました.
yambejp

2019/12/04 10:09

prototypeを通す処理のsampleあげておきました jsはprototypeを意識すれば拡張が可能な言語・・・程度に理解してればいいでしょう とはいえ、きちんと理解できていないならprototypeの拡張はあまりおすすめしません
slimat

2019/12/05 01:37 編集

ご返信ありがとうございます. ご回答の一部 > 上記hogeに直接メソッドを追加できません は, コンストラクタ関数Aの定義後はA.aaaのようにコンストラクタ関数にプロパティを追加できないということでしょうか?
yambejp

2019/12/05 01:52

追記しておきました
slimat

2019/12/05 01:59

追記読みました. コンストラクタ関数定義後はコンストラクタ関数にプロパティを追加できないことがわかりました. 助かりました. ご丁寧にありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問