使用函数原型的javascript继承问题

时间:2012-06-11 10:51:51

标签: javascript

我想在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。

我需要的是其他实例必须保持默认值或未定义

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

检查John Resig的这个简单的javascript继承,你会发现它很棒: http://ejohn.org/blog/simple-javascript-inheritance/

答案 2 :(得分: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();