2

サンプルの HTML コードを検討してください。

<head>
    ....
    <script src="/js/MyClass.js"></script>
    <script src="/js/extend.js"></script>
    <script>
        $(document).ready(function($) {
            var $obj=new MyClass();
            $obj.run();
        });
    </script>
</head>
<body>

MyClass.js ファイル:

var MyClass=function()
{
    this.run=function() {
        alert("MyClass");
    }
}

extend.js ファイル:

MyClass.prototype.run=function() {
    alert("Extend");
}

このコードが "Extend" ではなく "MyClass" を警告するのはなぜですか? クラスメソッドを正しく書き換える (オーバーロードする) 方法は?

4

3 に答える 3

1

プロトタイプは、オブジェクト自体がまだプロパティを持っていない場合にのみ使用されます。

あなたの場合、runオブジェクト自体を装着するので、それrunが解決されます。

ある意味で、MyClass は独自のプロトタイプをオーバーライドしています。

多分あなたがしたい

var MyClass=function(){};
MyClass.prototype.run = function() {
    alert("MyClass");
}

var overridden = new MyClass();
overridden.run = function() {
     alert("Extend");
}

これは、プロトタイプとは異なるメソッドを持つインスタンスになります。

または、プロトタイプを連鎖させてクラス階層をシミュレートすることもできます。

于 2013-10-09T10:36:09.107 に答える
0

MyClass コンストラクターがプロトタイプをオーバーライドしています。次のコードは、"MyClass"、"Extended"、"Overriden" を順番に警告します。最後のアラートは、インスタンスの機能を変更してもプロトタイプの機能は変更されないことを示しています。

var MyClass=function()
{
    this.run();
    MyClass.prototype.run = function() { alert( "Extended" ) };
    this.run();
    this.run=function() {
        alert("Overriden");
    };
    this.run();
};
MyClass.prototype.run = function() { alert( "MyClass" ); };
var myinstance = new MyClass();
alert( myinstance.run === MyClass.prototype.run );
于 2013-10-09T10:58:32.433 に答える