Как использовать наследование в JavaScript с методами конструктора, возвращающими литералы объекта с закрытыми свойствами? - PullRequest
0 голосов
/ 20 марта 2012
var Animal = function(config) {
    config = config || {};
    var name = config.name,
        numLegs = config.numLegs,
        weight = config.weight,
        speed = config.speed,
        sound = config.sound
    return {
        getName: function () {
            return name;
        },
        getNumLegs: function () {
            return numLegs;
        },
        getWeight: function () {
            return weight;
        },
        getSpeed: function () {
            return speed;
        },
        getSound: function () {
            return sound;
        },
        run: function(distance, unit) {
            unit = unit || 'miles';
            return 'The ' + name + ' ran ' + distance + ' ' + unit;
        },
        speak: function() {
            return 'The ' + name + ' says "' + sound + '"';
        }
    }
};

function DragonFly(config) {
    var me = {},
        numWings = config.numWings;
    me.prototype = new Animal(config);
    me.getNumWings = function() {
        return numWings;
    };
    me.fly = function(distance, unit) {
        unit = unit || 'miles';
        return 'The ' + me.name + ' flew ' + distance + ' ' + unit;
    }
    return me;
}

var dragonFly = new DragonFly({
    numWings: 2,
    name: 'DragonFly',
    numLegs: 6
});

Хорошо, если исходить из PHP, я немного не понимаю наследования в JavaScript, и мне нужна помощь.

По сути, вот что я хотел бы иметь возможностьсделать с экземпляром объекта dragonFly:

dragonFly.getName(); // 'DragonFly'
dragonFly.fly(1, 'mile'); // 'The dragonfly flew 1 mile';
dragonFly.run(1, 'yard'); // 'The dragonfly ran 1 yard';

Я также хотел бы знать, как переопределить методы и вызвать родителя этих переопределенных методов.Что не так с моим подходом?Все приведенные выше примеры возвращают неопределенное значение или выдают ошибку.Основная причина, по которой я выбрал объектно-литеральный стиль, заключается в том, что я могу сделать свойства приватными.

1 Ответ

2 голосов
/ 20 марта 2012

«самый быстрый» способ:

var Animal = function(config) {
config = config || {};
var name = config.name,
    numLegs = config.numLegs,
    weight = config.weight,
    speed = config.speed,
    sound = config.sound
return {
    getName: function () {
        return name;
    },
    getNumLegs: function () {
        return numLegs;
    },
    getWeight: function () {
        return weight;
    },
    getSpeed: function () {
        return speed;
    },
    getSound: function () {
        return sound;
    },
    run: function(distance, unit) {
        unit = unit || 'miles';
        return 'The ' + name + ' ran ' + distance + ' ' + unit;
    },
    speak: function() {
        return 'The ' + name + ' says "' + sound + '"';
    }
   }
};

function DragonFly(config) {
var me = new Animal(config);
var numWings = config.numWings;
me.getNumWings = function() {
    return numWings;
};
me.fly = function(distance, unit) {
    unit = unit || 'miles';
    return 'The ' + me.name + ' flew ' + distance + ' ' + unit;
}
return me;
}

var dragonFly = new DragonFly({
numWings: 2,
name: 'DragonFly',
numLegs: 6
});

Вы смешиваете 2 вида «наследования» в своем скрипте: «классическое» наследование и наследование прототипа, вы не можете сделать это, если не хотите бытьв серьезной беде.оба работают, оба имеют свои плюсы и минусы.Придерживайтесь «классического» наследования, или дополнения объекта, так как вы начали с него.

У литерала объекта нет прототипа, у функций есть прототипы.Вот почему по моему мнению js не "действительно" объектно-ориентированный, но он может имитировать объектно-ориентированные языки

Хорошим упражнением сейчас будет попытка использовать функции и прототипы, хотя я неуверен, что вы могли бы создать частные поля с этим.

Редактировать: me.name должно быть me.getName (), так как name "private".я думаю.

...