Noncommutative Field

記事検索

<<2005年08月 | 2005年09月 | 2005年10月>>

2005年09月28日

ECMAScript における this の意味

をまとめてみた。

this がグローバルコードにある

Global オブジェクト。

a = 0;
this.a;//0

this が関数コードにある

関数が単体で呼び出された

Global オブジェクト。

function func(){
    return this;
};
a = 1;
func().a;//1
関数がオブジェクトから呼び出された

呼び出したオブジェクト。

var object = {};
object.func = function(){
    return this;
};
object.func() == object;//true
関数が Function::prototype::apply や Function::prototype::call によって呼び出された
applycall の第1引数が null または undefined

Global オブジェクト。

function func(){
    return this;
};
a = 2;
func.call(null).a;//2
applycall の第1引数が null でも undefined でもない

第1引数がオブジェクトを指し示していたら、そのオブジェクト。そうでないなら、第1引数の表す値を Object 型に変換した結果のオブジェクト。

function func(){
    return this;
};
var object = {};
func.call(object) == object;//true

Tips

(function(){return this})() とやるとソースのどんな場所からでも Global オブジェクトが取得できる。

posted by malt3rd at 15:02 | TrackBack(0) | ECMAScript

2005年09月18日

ECMAScript の組込オブジェクトについてメモ

組込関数や組込コンストラクタのプロトタイプ
Function.prototype (の初期値)
関数やコンストラクタではない組込オブジェクトのプロトタイプ
Object.prototype (の初期値)

主要な組込オブジェクトの関係図

UML 作図ソフトを使ったために UML っぽく見えますが、UML とは全く関係ありません。白抜きの三角矢印がプロトタイプ参照を、普通の矢印がプロパティの参照を表しています。

参考リンク

Under Translation of ECMA-262 3rd Edition 15 ネイティブ ECMAScript オブジェクト (Native ECMAScript Objects)

posted by malt3rd at 14:35 | TrackBack(0) | ECMAScript

ECMAScript の 型変換についてメモ

String , Number オブジェクトを Object 型から String , Number 型へ変換すると、オブジェクトの内部にあるプリミティブな値が返される。

Boolean オブジェクトを Object 型から Boolean 型へ変換すると内部のプリミティブな値に関係なく必ず true が返される。そのため、

Boolean(false) && true;//これは当然 false
new Boolean(false) && true;//true

なんてことが起きる。

参考リンク

Under Translation of ECMA-262 3rd Edition 9 型変換 (Type Conversion)

posted by malt3rd at 11:01 | TrackBack(0) | ECMAScript

2005年09月07日

prototype.js を用いた OOP で、後方参照できるクラスを宣言する

実践 prototype.js [2] 中にある、ひげぽんさんの疑問の解決法を思いついた。

//この方法では引数が渡せない
function Hoge(){
    Hoge = Class.create();
    Hoge.prototype = (new HogeBase).extend({
        initialize : function(){...},
        ...
    });
    return new Hoge();
}

困ったのは最後の return new Hoge() である。これでは引数が渡せない。new がなければ Hoge.apply(Hoge , arguments) とか出来るのに。

しょうがないので eval を使って解決した。

//この部分は最初に読み込ませる
Function.prototype.createInstance = function(){
    var strArgs = 'new this(';
    for(var i = 0; i < arguments.length; i++){
        strArgs += 'arguments[' + i + ']';
        if(i != arguments.length - 1){
            strArgs += ',';
        }
    }
    strArgs += ')';
    return eval(strArgs);
}
Function.prototype.newWithArgumentsArray = function(args){
    return this.createInstance.apply(this , args);
}


//Hoge は後方参照できる
function Hoge(){
    Hoge = Class.create();
    Hoge.prototype = (new HogeBase).extend({
        initialize : function(){...},
        ...
    });
    return Hoge.newWithArgumentsArray(arguments);
}

eval を使わずに解決する方法はないものだろうか?

正解がトラックバックされています。


ただし、後方参照できているかのように振舞うのは new HogeHoge() の場合のみだ。メソッドを追加しようとして、Hoge.prototype.additionalMethod = function(){...} などとやっても事前に new HogeHoge() を1回でも行ってない限り、書き換えられる前の Hoge のプロパティに追加されてしまいうまくいかない。後方参照できるということは、定義が静的であるということだから、動的にやるとうまくいかないのは当然だろう。

posted by malt3rd at 13:35 | TrackBack(1) | ECMAScript

プロフィール

名前
malt3rd
URL
http://www.geocities.jp/commutativefield/
メールアドレス
malt3rd {dot} NoncommutativeField {at} submit-asap {dot} org
Powered by Seesaa

RDF Site Summary

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。