6

私は現在、JavaScriptとプロトタイピングについてより深く理解しようとしています。

関数を追加したかったのですdocumentが、prototypeで定義されていませんdocument

このコード:

document.prototype.writeLine = function(text){
    this.write(text);
    this.write("<br />");  
};

このエラーを生成します:

// In FireFox
TypeError: document.prototype is undefined

// In Chrome
Uncaught TypeError: Cannot set property 'writeLine' of undefined 

documentオブジェクトを拡張して、似たようなものを呼び出せるようにするにはどうすればよいdocument.WriteLine('MyText')ですか?

これが私が使っているフィドルです。

4

3 に答える 3

9

私はあなたのフィドルを更新しました。あなたが抱えていた問題は、オブジェクトがオブジェクトタイプdocumentのインスタンスであるということです。インスタンスHTMLDocument自体にはプロトタイプがありませんが、プロトタイプはあります。HTMLDocument

更新HTMLDocument:IE9ではがであるため、IE9で機能するスニペットを次に示しundefinedます。

if (typeof HTMLDocument !== 'undefined') {
    HTMLDocument.prototype.writeLine = function(text){
        this.write(text);
        this.write("<br />");  
    };
} else {
    Document.prototype.writeLine = function(text){
        this.write(text);
        this.write("<br />");  
    };
}

document.writeLine("Line 1");
document.writeLine("Line 2");

于 2012-10-02T11:58:01.830 に答える
1

問題は、それdocumentがタイプobjectであり、ではないことfunctionです。JavaScript では、次のように関数をコンストラクターとして使用します。

function MyClass() {
    this.myProperty = "something";
}

MyClass次のようにインスタンスを作成できます。

var myInstance = new MyClass;
alert(myInstance.myProperty);

すべての関数prototypeには、オブジェクトであるというプロパティもあります。プロトタイプのすべてのプロパティは、コンストラクター関数のインスタンスに継承されます。

MyClass.prototype.displayProperty = function () {
    alert(this.myProperty);
};

myInstance.displayProperty();

あなたの場合document、コンストラクター自体ではなくコンストラクターのインスタンスであるため、呼び出されるプロパティはありませんprototype

JavaScript での継承の詳細については、この回答をお読みください。

于 2012-10-02T12:10:10.630 に答える