Skip to content

Instantly share code, notes, and snippets.

@e-jigsaw
Last active December 17, 2015 11:09
Show Gist options
  • Select an option

  • Save e-jigsaw/5600478 to your computer and use it in GitHub Desktop.

Select an option

Save e-jigsaw/5600478 to your computer and use it in GitHub Desktop.

jsのstring.prototypeとかを拡張して使うのってどう思う?good partsでは推奨されてるみたいなんやけど、、、

http://twitter.com/takanamito/status/335424369155272704

禁忌だとおもう。Objectprototype拡張するようなモジュールはちょっと使いたくないかな、っておもっちゃうぐらい。

じゃあ、どんな感じで書けばいいの

めんどくさいのでCoffeeで書いてみた、jsもそれっぽく書けばいいんだとおもう(適当) たとえば、Arrayの拡張なんかはすごい簡単で

class MyArray extends Array
  myNewMethod: ->
    console.log "It works!"
myArray = new MyArray()
myArray.myNewMethod() #=> It works!
myArray.push "a" #=> ["a"]

こんな感じでextendsすればあっさり拡張できる。で、Stringでもできるっしょ!ってやってみると

class MyString extends String
  myNewMethod: ->
    console.log "It works!"
myString = new String "Test"
myString.myNewMethod() #=> TypeError: String.prototype.toString is not generic

てな感じでエラーが出る。で、調べてみるとESまわりのどうたらこうたらでエラるらしい。んで、どうやって書けばいいかというと

String::myNewMethod =->
  console.log "It works!"

"ready".myNewMethod() #=> It works!

でもコンパイルされたjsを読んでみると

// Generated by CoffeeScript 1.6.2
String.prototype.myNewMethod = function() {
  return console.log("It works!");
};

"ready".myNewMethod();

アカンやんけ!!!

つーわけで、少なくともStringは無理なのかもしれないのでもしかしたらjsパタン本が正しいのかもしれない。。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment