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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Babel

Babelは、JavaScriptの次世代仕様であるECMAScriptのコンパイラ。次世代の標準機能を用いて記述されたコードを、それらの機能に対応していないブラウザでも動作するコードに変換することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

1回答

2579閲覧

javascript(node-babel) で instanceof が思った通りの結果を返さない

mit0223

総合スコア3401

Babel

Babelは、JavaScriptの次世代仕様であるECMAScriptのコンパイラ。次世代の標準機能を用いて記述されたコードを、それらの機能に対応していないブラウザでも動作するコードに変換することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2016/10/13 08:27

###問題点
node-babel で instanceof が思った通りの結果を返しません。自分が作成したクラスのインスンタンスを new して直後に instanceof で聞くと、 false が返ります。なぜ、true にならないのかわかりません。以下のソースコードとおり、クラスのインスタンスを作成し instanceof で問い合わせると、なぜか false がかえります。

どうも、 Error クラスから extends しているのがだめなようですが、理由がわかりません。
また、いろいろ回避策は考えられますが、スマートな回避策があれば、ご教示ください。

Javascript

1class LogicError extends Error { 2 constructor(message) { 3 super(message); 4 } 5} 6let le = new LogicError('Some Error.'); 7console.log(le instanceof LogicError); // なぜ false? 8console.log(le instanceof Error); // true 9

実行結果は以下の通り。

$ ./node_modules/babel-cli/bin/babel-node.js test.js --presets es2015,stage-0 false true

###環境
macOS Sierra 10.12
node.js v4.5.0
node_modules
├── babel-cli@6.16.0
├── babel-core@6.17.0
├── babel-preset-es2015@6.16.0
└── babel-preset-stage-0@6.16.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

node-babelのextendsにバグがあるようにしか見えないので、
「node-babel extends」でぐぐってみたら、全く同じような質問を見つけました。

http://stackoverflow.com/questions/33870684/why-doesnt-instanceof-work-on-instances-of-error-subclasses-under-babel-node

要約するとextends使うなってことですかね?
「ExtendableBuiltin」を作るとかバッドノウハウ臭が凄まじいです…


当方LiveScriptに逃げた勢なので、ES6やBabelは疎いのですが、
LSでの解決策を見てみました。

LiveScript

1class Hoge extends Error 2 name: -> 234 3 type: -> "Hoge" 4 5a = new Hoge() 6 7console.log(a instanceof Error) # true 8console.log(a instanceof Hoge) # true

こちらがコンパイル結果です。

JavaScript

1var Hoge, a; 2Hoge = (function(superclass){ 3 var prototype = extend$((import$(Hoge, superclass).displayName = 'Hoge', Hoge), superclass).prototype, constructor = Hoge; 4 Hoge.prototype.name = function(){ 5 return 234; 6 }; 7 Hoge.prototype.type = function(){ 8 return 'Hoge'; 9 }; 10 function Hoge(){ 11 Hoge.superclass.apply(this, arguments); 12 } 13 return Hoge; 14}(Error)); 15a = new Hoge(); 16console.log(a instanceof Error); 17console.log(a instanceof Hoge); 18function extend$(sub, sup){ 19 function fun(){} fun.prototype = (sub.superclass = sup).prototype; 20 (sub.prototype = new fun).constructor = sub; 21 if (typeof sup.extended == 'function') sup.extended(sub); 22 return sub; 23} 24function import$(obj, src){ 25 var own = {}.hasOwnProperty; 26 for (var key in src) if (own.call(src, key)) obj[key] = src[key]; 27 return obj; 28}

この概念を元にextendsを使わない自作Errorを生成して、
Errorを混ぜる関数を作れば良いのですが、これもバッドノウハウですね。

おとなしくnode-babelのサイトにissueを投げまくるしかないと思います。

投稿2016/10/13 08:52

編集2016/10/14 01:32
miyabi-sun

総合スコア21158

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

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

mit0223

2016/10/13 09:13

ありがとうございます。一応、ググったのですが、見つけられていませんでした。 単に Promise で cacth したエラーを判別したかっただけなので、何か別の手段を考えます。ExtendableBuiltin はちょっと・・・isLogicError フラグですかね。
mit0223

2016/10/14 05:13

密かに LiveScript を広めようとされてますかww teratail 言語&フレームワークステマ大会でも開催してほしいですよね。いや、大会ならステマじゃないか。 当方も書き始めちゃったので後戻りは難しいです。この件については、 isLogicError フラグをつけて回避しました。ありがとうございました。
miyabi-sun

2016/10/14 06:05

ばれましたか(/ω\) あまりお役に立てずにすみません。 がんばってください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問