0

これが私のコードです:

function Class() {};

Class.prototype.extend = function () {
    var instance = new Class();
    instance.constructor.prototype = {
        say: function () {
            console.log("Hello");
        }
    }
    console.log(instance); //Class {extend: function}
}

Class.extend = function () {
    this.prototype.extend();
}

Class.extend();

メソッドではextend、インスタンスのプロトタイプを書き換えinstance.constructor.prototype = {..}

ただし、インスタンスをログに記録すると、sayメソッドが表示されません

書き換えがうまくいかないのはなぜですか?どうすればそれを機能させることができますか?

ここにデモがあります

4

4 に答える 4

1

新しいプロトタイプ オブジェクトを割り当てると、新しくインスタンス化されたオブジェクトだけが新しいプロトタイプを持つようになります。

function Class() {};

Class.prototype.extend = function () {
    var instance = new Class();
    instance.constructor.prototype = {
        say: function () {
            console.log("Hello");
        }
    }
    console.log(instance);    //Class {extend: function}
    console.log(new Class()); //Class {say: function}
}

Class.extend = function () {
    this.prototype.extend();
}

Class.extend();

これは、プロトタイプ オブジェクトへの参照が、オブジェクトのインスタンス化時にコンストラクターのプロトタイプからコピーされるためです。既存のすべてのインスタンスと将来のインスタンスのプロトタイプに追加する場合は、コンストラクターにまったく新しいオブジェクトを割り当てるのではなく、プロトタイプ オブジェクトを変更するだけです。

function Class() {};

Class.prototype.extend = function () {
    var instance = new Class();
    instance.constructor.prototype.say = function () {
        console.log("Hello");
    }
    delete instance.constructor.prototype.extend;
    console.log(instance); //Class {say: function}
}

Class.extend = function () {
    this.prototype.extend();
}

Class.extend();
于 2013-07-30T16:25:11.290 に答える
0

非標準のアプローチですが、これは、JS 環境でproto内部プロパティを編集できる場合に役立ちます。

function Class() {};

Class.prototype.extend = function () {
    var instance = new Class();
    instance.__proto__ = instance.constructor.prototype = {
        say: function () {
            console.log("Hello");
        }
    }


    console.log(instance); //Class {extend: function}
    console.log(instance.say)
}

Class.extend = function () {
    this.prototype.extend();
}

Class.extend();
于 2013-07-30T16:24:37.407 に答える
0

私はこの機能を追加します。ただしprototype、プロパティを変更するのではなく、オブジェクト自体を変更しています。

デモ

Class.prototype.extend = function () {
    var instance = new Class();
    instance.constructor.prototype.say =
        function () {
            console.log("Hello");
        }
    console.log(instance);
    // Class {extend: function, say: function}

}

JS エンジン自体にアクセスしようとするsome_obj.some_fieldと、最初にオブジェクト自体のプロパティがチェックされ、次に に移動しsome_obj.prototypeて が検索されsome_fieldます。

を割り当てるinstance.constructor.prototype = {...}ことで、新しく作成されたすべてのオブジェクトの が指す場所を変更しますがprototype、既存のオブジェクトは変更しません。

于 2013-07-30T16:16:20.703 に答える