質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

解決済

3回答

833閲覧

JavaScriptで既存のメソッドに新しいメソッドを追記する方法について教えて欲しいです。

aki.t

総合スコア5

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

2グッド

1クリップ

投稿2020/04/14 02:58

JavaScriptのオーバーライド・メソッド追記について

最近JSを勉強しはじめた初心者なので基礎的な質問で恐縮ですが、
オーバーライドではメソッドの上書き・追記ができるものと認識していましたが間違いでしょうか。

オーバーライドのについて勉強したところ。下記のような説明がありました。

var

1Human.prototype.speak = function() { 2 console.log('こんにちは!'); 3} 4 5var Boy = function() {} 6Boy.prototype = new Human(); 7 8//新しく「speak」メソッドを書き換える 9Boy.prototype.speak = function() { 10 console.log('こんにちは、Boyオブジェクト!'); 11} 12 13var taro = new Boy(); 14 15taro.speak();

https://www.sejuku.net/blog/28158

上書きについてはなんとなく理解できたのですが、例えば今まで使っていたメソッドはそのままに新しくメソッドを追加する方法はありますでしょうか。
イメージとしては下記のような状態にしたいです。

var

1Human.prototype.speak = function() { 2 console.log('こんにちは!'); 3 4 //新しく「speak」メソッドに「console.log('こんにちは、Boyオブジェクト!');」を追加 5 console.log('こんにちは、Boyオブジェクト!'); 6}

分かる方いたら教えていただきたいです。
よろしくお願いします。

Lhankor_Mhy, miyabi_pudding👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

例えば今まで使っていたメソッドはそのままに新しくメソッドを追加する方法はありますでしょうか。

自分で従来のメソッドを呼んでチェーンすることとなります。

javascript

1Boy.prototype.speak = function() { 2 // 親のメソッドを呼ぶ 3 Human.prototype.speak.call(this); 4 5 console.log('こんにちは、Boyオブジェクト!'); 6}

投稿2020/04/14 03:33

maisumakun

総合スコア145183

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

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

0

質問文のコードはES5という古い実装の方法ですね。

基本的にオーバーライド!という機能はありませんので、
それで良いです。


プロトタイプベースなんて独特だし、
他の言語からの乗り換え組としてはややこしくて仕方ありません。

要望が多かったのか、
ES2015という比較的新しいバージョンにてクラス構文が実装されました。
こちらにもオーバーライドの機能はありませんが、
継承先で同じメソッド名を定義するだけでオーバーライドになります。

ついでにsuperというキーワードで親のクラスにアクセスできます。
なので親のメソッドも実行しておきたいケースも余裕です。

下記の記事が良い感じでまとまっていました。
参考記事: (初心者向け) JavaScript のクラス (ES6 対応) - Qiita

メソッドのオーバーライド

メソッドのオーバーライドは特にキーワードなどなしで使えます。次のサンプルでは2重に継承を行い、メソッド distance() をオーバーライドしています。

コードは長いのでメソッドのオーバーライドのセクションを見てください。


クラス構文は既にブラウザの対応も整備され、IE11のサポートが切れるのを待つだけの状態になっています。

これを機に、クラス構文への乗り換えをおすすめします。
ES2015以降のコードをES5相当に変換するBabelというツールもありますのでIE11対応は考えなくても問題ありません

最後に先程のクラス構文のコードをBabelで変換させたものを記載します。
全部追加の関数の中に隠蔽されちゃっててよく分かりませんね。

js

1// 【省略】上の方に変換用のコードが大量に生成される 2 3// 基本クラス Point を class 宣言 4var Point = function Point() { 5 var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; 6 var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; 7 8 _classCallCheck(this, Point); 9 10 this.x = x; 11 this.y = y; 12}; // 派生クラス PointEx をクラス式で作成 13 14var PointEx = /*#__PURE__*/function (_Point) { 15 _inherits(PointEx, _Point); 16 17 var _super = _createSuper(PointEx); 18 19 function PointEx(x, y) { 20 _classCallCheck(this, PointEx); 21 22 return _super.call(this, x, y); 23 } // 原点からの距離を返す。 24 25 26 _createClass(PointEx, [{ 27 key: "distance", 28 value: function distance() { 29 return Math.sqrt(this.x * this.x + this.y * this.y); 30 } 31 }]); 32 33 return PointEx; 34}(Point); // NaN を判別できるように改良したクラス 35 36 37var PointExEx = /*#__PURE__*/function (_PointEx) { 38 _inherits(PointExEx, _PointEx); 39 40 var _super2 = _createSuper(PointExEx); 41 42 function PointExEx(x, y) { 43 var _this; 44 45 _classCallCheck(this, PointExEx); 46 47 _this = _super2.call(this, x, y); 48 _this.valid = !(x === NaN || y === NaN); 49 return _this; 50 } // オーバーライドしたメソッド 51 52 53 _createClass(PointExEx, [{ 54 key: "distance", 55 value: function distance() { 56 if (this.valid) { 57 // NaN でない場合は、基底クラスの distance() を呼び出す。 58 return _get(_getPrototypeOf(PointExEx.prototype), "distance", this).call(this); 59 } else { 60 return null; 61 } 62 } 63 }]); 64 65 return PointExEx; 66}(PointEx); 67 68var p = new PointExEx(2, 4); 69console.log("(%d, %d)", p.x, p.y); 70console.log("valid = %s", p.valid.toString()); 71console.log("distance = %d", p.distance());

投稿2020/04/14 03:49

miyabi-sun

総合スコア21158

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

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

0

オーバーライドではメソッドの上書き・追記ができるものと認識していましたが間違いでしょうか。

クラスベースのオブジェクト指向言語ではその認識で正しいです。
JavaScript は プロトタイプベースのオブジェクト指向言語ですので、仕様上の厳密なところでは違います。
JavaScriptのオブジェクト定義と、継承方法は様々です。

(トランスパイラすら使わない)独特な書き方

javascript

1function ClassA () { 2} 3// Object.assign() を使ったメンバ定義(IEでは使えません) 4Object.assign(ClassA.prototype, { 5 hoge () { 6 return "HOGE" 7 } 8}); 9 10function ClassB () { 11} 12// Object.create() を使った継承方法 13ClassB.prototype = Object.create(ClassA.prototype, { 14 constructor: { value: ClassB } 15}); 16Object.assign(ClassB.prototype, { 17 hoge () { 18 // musumakun さんの回答 19 let superVal = ClassA.prototype.hoge.call(this); 20 21 return superVal + "HOGE"; 22 }, 23 24 // 親オブジェクトのメソッドを別名で持たせておく手法 25 _ClassA_hoge : ClassA.prototype.hoge, 26 hogu () { 27 // ここで _ClassA_hoge を使う 28 let superVal = this._ClassA_hoge(); 29 return superVal + "HOGU"; 30 } 31 32}); 33console.log( (new ClassB()).hoge() ); // "HOGEHOGE" 34console.log( (new ClassB()).hogu() ); // "HOGEHOGU" 35

投稿2020/04/14 22:14

編集2020/04/14 22:17
AkitoshiManabe

総合スコア5432

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問