0

私はJSプログラミングが初めてで、プロトタイプベースの継承を理解しようとしています。以下は私のテストコードで、行メソッド「parseParameters」について質問があります。

私が知っているように、クラス Point をインスタンス化して次のように絞るとき:

var p = new Point ({x: 1, y: 1});
alert(p.x);

メンバー 'x' は最初に Point クラスで検索され、次にそのプロトタイプ (Shape) で検索されました。そうですか?

そして、質問自体: メンバー 'x' と 'y' はどこに作成されますか? Point クラスまたは Shape (プロトタイプ) で?

1 つのコメント: 実際に考えるべきですか? 多分それはごくわずかな質問であり、メンバーがどこで作成したかは問題ではありませんか?

var Shape = function () {}

Shape.prototype = {
    getParameter: function (params, name) {
        return params !== null && params !== undefined
            ? params[name]
            : 0;
    },

    parseParameters: function(params, names) {
        if (params === null || params === undefined) {
            return;
        }

        for(var i = 0; i < names.length; i++) {
            this[names[i]] = params[names[i]];
        }
    }
}

var Point = function (params) {
    this.parseParameters(params, ['x', 'y'])
}

Point.prototype = new Shape;
4

1 に答える 1

0

p.x

メンバー'x'は、最初にPointクラスで検索され、次にそのプロトタイプ(Shape)で検索されました。正しいですか?

それを除けば、JavaScriptには「クラス」はありません。プロパティ名は、最初にpオブジェクト自体で検索され、次に継承元のオブジェクトで検索されます(内部リンクがあります)。

メンバー「x」と「y」は、PointクラスまたはShape(プロトタイプ)のどこに作成されますか?

それらを作成する方法によって異なります:-)

のような単純な割り当てでは(これは'p.x = 1;でも発生します)、プロパティはオブジェクト上に作成されます。parseParametersthis[names[i]] = params[names[i]]this === pp

私は実際にそれを考えるべきですか?たぶん、メンバーがどこで作成したかは関係ありませんか?

いいえ、それは本当に重要です。プロトタイプオブジェクトでそれらを作成する場合、そのオブジェクトから継承するすべてのオブジェクトは同じ値を共有します。これは関数には便利ですが、インスタンスごとに異なる必要があるデータプロパティには壊滅的です(例として、JavaScriptオブジェクトのプロパティが他のインスタンスによって上書きされる理由も参照してxくださいy

于 2012-12-07T14:17:02.913 に答える