0

次のように、コンストラクター関数でextendメソッドを実現し、それを使用してインスタンスを初期化したいと考えています。

var view_instance = View.extend()

だから私はこれを試しました:

define(function (require, exports, module) {

    function View(size, color) {
        this.size = size;
        this.color = color;
    };

    View.prototype = {
        show: function () {
            console.log("This is view show");
        }
    }

    View.extend = function (props) {
        var tmp = new this("12", "red");
        console.log(this);
            console.log(tmp instanceof this) //true
        console.log(tmp.prototype); //undefined!
        return tmp
    }

    return View;
})

上記のextend方法では、 を使用してインスタンスを初期化しましたnew this()が、そのプロトタイプをログに記録できず、thisが正しいことを確認しました。

では、私のコードの何が問題なのですか? なぜプロトタイプは消えたのですか?どうすれば正しくできますか?

4

3 に答える 3

1

tmp.constructor.prototypeあなたが望むものです。o.__proto__は単なるショートカットでo.constructor.prototypeあり、非標準です。

[編集]

この質問の図を見ることができます。Foo.prototype.constructorがそれ自体を指していることを示していFooます。ただし、コンストラクターのプロトタイプを行で上書きしているため、それ自体ではなく ,View.prototype = {...}View.prototype.constructorなります。したがって、より正確な方法は、元のプロトタイプにプロパティを直接割り当てるか、手動で設定されたプロパティで上書きすることです。function Object() { [native code] }Viewconstructor

// Assign properties to the original prototype to prevent overwriting the `constructor` properties.
View.prototype.show = function() {};

// Or set the constructor manually.
View.prototype = {
  show: function() {},
  constructor: View
};
于 2013-07-26T02:04:06.967 に答える
1

コードに問題はありません。それはそれがするべきことをします。prototypeプロパティは関数にのみ存在します。

関数呼び出しの前にキーワード JavaScript を付けると、コンストラクターnewの を継承するオブジェクトが作成されます。prototype

簡単に言えば:

function F() {}                                        // we have a constructor
var o = new F;                                         // we create an instance
console.log(Object.getPrototypeOf(o) === F.prototype); // o inherits from
                                                       // F.prototype

JavaScript のオブジェクトは、委譲によって他のオブジェクトから継承します。oこれは、上で見たオブジェクトのプロパティにアクセスしようとすることを意味します。

  1. JavaScript は、最初にそれ自体でプロパティを見つけようとしますo
  2. プロパティが見つからない場合は、oそれを見つけようとしますObject.getPrototypeOf(o)(または、より簡潔に言えばo.__proto__)。のプロトタイプはoですF.prototype
  3. でプロパティが見つからない場合は、 である でそれF.prototypeを見つけようとします。F.prototype.__proto__Object.prototype
  4. 上のプロパティが見つからない場合は、 is でObject.prototypeあるためあきらめます。Object.prototype.__proto__null

一言で言えば、これはプロトタイプの継承です。

コードがログに記録する理由は、と呼ばれるプロパティがないundefinedためです。関数だけがプロパティを持っています。代わりにこれを試してください:tmp.prototypetmpprototypeprototype

console.log(Object.getPrototypeOf(tmp));

上記は以下と同じです。ただし、__proto__オブジェクトのプロパティは非推奨です。ご自身の責任で使用してください。

console.log(tmp.__proto__);

継承について詳しく知りたい場合は、次の記事をお読みください。

  1. アーディット・M・シャー | プロトタイプの継承が重要な理由
  2. JavaScriptの継承とコンストラクターのプロパティ
于 2013-07-26T02:32:35.523 に答える
0

prototypeプロパティはコンストラクターに属します。__proto__インスタンスには、同じオブジェクトを指す非標準のプロパティがあります。そう:

console.log(tmp.__proto__);

または:

console.log(Object.getPrototypeOf(tmp));
于 2013-07-26T02:01:55.117 に答える