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");

这里的问题是当我设置奥迪的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 继承,你会发现它很神奇: http ://ejohn.org/blog/simple-javascript-inheritance/

于 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 回答