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

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

新規登録して質問してみよう
ただいま回答率
85.50%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

Q&A

解決済

1回答

2800閲覧

GASで親のメソッドの正しい上書き方法を知りたい

supereater712

総合スコア29

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

0グッド

1クリップ

投稿2019/06/25 05:32

編集2019/06/25 12:34

前提・実現したいこと

GASでLINE_Botを作っています。
プロトタイプベースのオブジェクト指向を行っていますが、
メソッドの上書きに問題があって質問に参りました。

該当のソースコード

下記の通り、pushメソッドで自身の内部にテキストをハッシュに変換して格納する Payload_item クラスがあります。
そして、そのインスタンスのmesを作成し、
また mes自身にメッセージを2つ格納するテストを作成しています。

GAS

1var Payload_item=function(args){ 2 this.data=[]; 3} 4Payload_item.prototype.push=function(){ 5 for(var i=0; i<arguments.length; i=i+1){ 6 this.data.push(this._packed(arguments[i])); 7 } 8} 9Payload_item.prototype._packed=function(){ 10 throw "method _packed is not implemented"; 11} 12 13var mes=new Payload_item({limit:2000}); 14mes.prototype._packed=function(str){ 15 return {type:"text","text":str}; 16} 17 18function mes_test(){//実行する関数 19 mes.push("テスト1","テスト2"); 20 Logger.log(mes.data); 21}

mesはPayload_itemの _packed メソッドの上書きを試みています。
しかし実行すると、

GAS

1TypeError: undefined のプロパティ「packed」を「(class)@7d880f87」に設定できません。

test関数のmes.pushの行で、エラーが発生しました。

試したこと

しかし、以下のようにmesの_packedメソッドからprototypeの記述を欠いたとき、
mesによるメソッド上書きは動作しました。

GAS

1mes._packed=function(str){ 2 return {type:"text","text":str}; 3} 4 5function mes_test(){//実行する関数 6 mes.push("テスト1","テスト2"); 7 Logger.log(mes.data);// [{text=テスト1, type=text}, {text=テスト2, type=text}] 8}

動作は成功ですが、prototypeの表記をなくしたので、メソッドは参照するものではなくなったかもしれません。
メソッドの上書きがこれが正しい方法か、教えて頂きたいです。

補足

前回の質問では、回答とクラス構文の存在を教えていただき有難うございました。
しかし、申し訳なくも、再びプロトタイプベースで質問に参りました。
クラス構文をトランスパイルする手段が一番良いのがもっともです。

ただ今回ばかりは、クラス構文では気にしないであろうこの問題が起きたので、
ES6でちゃんと取り掛かる前に、この問題についてご教授頂きたく参りました。
どうか回答のほど宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

インスタンスはprototypeを持ちません。そういう発想だとそもそもmes.prototype.push(1)としなければならないはずです。

インスタンスになるとき、生成側のprototypeが__proto__に設定される動作をするはずです。

はずっていうのはこれがgoogle app scriptだから厄介なポイントでgasはrhino(の途中のバージョン)なのでオブジェクトが__proto__を持ってません。

gasでjsの勉強をするのはやめたほうがいいです。

また、インスタンス化された後でのメソッドの上書きとしては、その動く方でよいです。良いというかgasではそれしかできない。

そもそもメソッドのオーバーライドはオブジェクトの継承のときにやるもので、抽象オブジェクトの立場に立たないPostItemがnot implementedだったり、インスタンスがメソッドを上書きしたりするという考えかたが筋が悪いです。
クラスを継承して子クラスでメソッドを上書きする方法を、プロトタイプでやってみる、という方向で考えられてはいかがでしょうか。

投稿2019/06/25 10:27

papinianus

総合スコア12705

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

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

papinianus

2019/06/25 10:29

gas**では**それしかできない、というところについて他の実装ならmes.__proto__を書き換える余地があるからです。
supereater712

2019/06/25 12:33

gasは挙動もjsと異なるんですね… ただ、そうであっても、そもそも私は子クラスとインスタンスの区別もついていませんでした。 勉強し直します。 そして、まずはこれをクラスの継承でやり直そうと思います。 解答を頂いただけでなく、指針も大変参考になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問