4

私はjsで継承の概念を使いたいので、私がやったことは

function myGarage(x) {
        var _x = x;
        Object.defineProperty(this, "BenZ", {
            get: function () {
                return _x;
            },
            set: function (value) {
                _x = value;
            },
            enumerable: true,
            configurable: true
        });
    }
    myGarage.prototype = new MyCar();
    function MyCar() {
     var _x =0;
        Object.defineProperty(this, "Audi", {
            get: function () {
                return _x;
            },
            set: function (value) {
                _x = value;
            },
            enumerable: true,
            configurable: true
        });
    }

この後、のインスタンスを作成しましたmyGarage

        var g1 = new myGarage(true);
        var g2 = new myGarage(false);
        var g3 = new myGarage("null");

ここでの問題は、Audi のg1.Audi = 10;他のすべてのインスタンスがサンプル値を保持するように設定した場合です。myGarage

(例えば)

    g1.Audi = 10;
    var a = g2.Audi // a is 10
    var b = g3.Audi; // b is 10

しかし、値をg1に設定しました。

私が必要とするのは、他のインスタンスがデフォルト値または未定義を保持する必要があることです

4

3 に答える 3

3

まず第一に、ガレージは車から継承するのではなく、多くの車のインスタンスを保持します。

次に、JavaScript オブジェクト モデルではなくクロージャーを使用しています。クロージャー モデルでは、オブジェクトは「そのデータ」を所有していませんが、データの実際の所有者であるクロージャーのダム ストアとして扱われます。閉鎖モデルでは、継承などの機能が失われます。

継承を使用するには、次のようにします。

function MyCar() {
    this.Audi = 0;
}

MyCar.prototype = {
             //Todo: name the method properly
    setAudi: function(audi) {
        this.Audi = audi; //Do bunch of other stuff here
    },

    constructor: MyCar
};

function MyGarage(x) {
    this.Benz = x;
}

MyGarage.prototype = Object.create( MyCar.prototype );

MyGarage.prototype.constructor = MyGarage;

MyGarage.prototype.garageMethod1 = function() {

};

var g1 = new MyGarage(null),
    g2 = new MyGarage(false),
    g3 = new MyGarage(true);

    console.log( g1.Benz, g2.Benz, g3.Benz );
    //null false true

上記には、多くのライブラリで軽減できるボイラープレートがいくつかあります。特にお勧めはありません。

JavaScript のオブジェクト モデルの詳細: https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model

于 2012-06-11T11:17:20.450 に答える
0

John Resig によるこの単純な JavaScript の継承を確認してください。すばらしいことがわかります

于 2012-06-11T11:57:19.200 に答える
0

次のコードを試してみてください。これは正常に動作します。

$(document).ready(function () {

        var g1 = new MyGarage(true);
        var g2 = new MyGarage(false);
        var g3 = new MyGarage("null");
        g1.Audi = 10;
        var a = g2.Audi
        var b = g3.Audi;

    });
    function MyCar() {
        var _x = 1;
        Object.defineProperty(this, "Audi", {
            get: function () {
                return _x;
            },
            set: function (value) {
                _x = value;
            },
            enumerable: true,
            configurable: true
        });
    }
    function MyGarage(x) {
        MyCar.apply(this, arguments);
        var _x = x;
        Object.defineProperty(this, "BenZ", {
            get: function () {
                return _x;
            },
            set: function (value) {
                _x = value;
            },
            enumerable: true,
            configurable: true
        });
    }
    MyGarage.prototype = new MyCar();
于 2012-06-11T13:25:43.700 に答える