Hatena::Grouppatchservice

GOE inside PatchService このページをアンテナに追加 RSSフィード

 | 

2007-10-24log4jsでObject汚染を回避する方法 このエントリーを含むブックマーク このエントリーのブックマークコメント

前回エントリー分の続きです.

PatchServiceではJavaScriptのロガーとして

を使っています.

このlog4jsってのは結構高機能で便利なのですが,内部でObject.prototype.extendを新たに追加して使用しているためにfor-in構文を使っているとよろしくない挙動を示します.そこで今回はソースを修正してObject汚染をしないように変更してみようと思います.(ソース読んだら思いのほか簡単だたw)


まずは諸悪の根源である以下の関数削除

Object.prototype.extend = function(object) {
  return Object.extend.apply(this, [this, object]);
};

prototype.jsを使っている人は

Object.extend = function(destination, source) {
  for (property in source) {
    destination[property] = source[property];
  }
  return destination;
};

も冗長なので消しても良いかも.prototype.jsの内部で書いているextendとまったく同じみたいです.

そんでもってソース中にある以下のextendを使っている部分を検索して

Log4js.ConsoleAppender.prototype = (new Log4js.Appender()).extend( {  

後半部分を

Log4js.ConsoleAppender.prototype = Object.extend(new Log4js.Appender(),{  

に変更.

ちなみにextend使っていて書き換えないといけない箇所は10以上あるっぽいので単純作業ですが,がんばって書き換えましょう.よ~するにObject.prototype.extendで定義して使っていたものをObject.extendを使うように書き換えるだけです(゚∀゚)

以上,でObject汚染を回避して問題なく使えるはず!たぶん・・・.十分なテストはしていないのですが,extendで検索して漏れなく書き換えてさえいれば特に問題も出ないんじゃないでしょうか.そもそもこれだけのことにObject.prototypeを書き換えるなYO!って話ですね(´・ω・`)

以上,そんな感じで.バグ等あればご一報いただけるとうれしいです.

でわでわ.

 |