繼承String物件

 Mon, 16 Mar 2009 22:06:01 +0800

看到有人問如何繼承javascript內建的String物件,於是動手試了一下。果然,不是想像中的簡單。

粗淺的想法是:

function NewType() {
}
NewType.prototype = new String;

但是這樣沒辦法使用到繼承的String內建的方法...

看了一下ECMA-262,裡面關於String Native Object的定義中,所有native function的動作第一步都是做ToString。所以試著調整NewType讓他盡量相容看看:

function NewType(str) {
    this._str = str;
    this.toString = function() {
        if(this._str && typeof(this._str)==="string") {
            return this._str||"";
        } else {
            throw("Type Error.");
        }
    }
}
NewType.prototype = new String;

恩...測試了一下,如果使用運算子"+"會出現呼叫valueOf()的錯誤,所以另外加了這個函數的實作,同時也試著給NewType加上一個trim方法,並做測試:

function NewType(str) {
    this._str = str;
    this.toString = function() {
        return this.valueOf();
    }
    this.valueOf = function() {
        if(this._str && typeof(this._str)==="string") {
            return this._str||"";
        } else {
            throw("Type Error.");
        }
    }
}
NewType.prototype = new String;
NewType.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/, '');
};
var b = new NewType("a new day is coming \nfrom now on ");
alert(b);
alert(b+"|");
alert(b.indexOf("co"));
alert(b.trim()+ "|");
alert(b.toUpperCase());
alert(b.charAt(3));

ok,這樣就不會出現錯誤了,而且在ff3、ie7、safari、google chrome都可以正確執行。