JavaScript: наследование по прототипу, без использования прототипа для определения / вызова методов - PullRequest
0 голосов
/ 25 января 2012

Я создал несколько библиотек и библиотек расширений, и для меня не практично использовать прототип, потому что в реальности у вас действительно есть закрытые переменные, к которым нет необходимости обращаться из экземпляра объекта.

var parent_class = function(num) {
    var number = num;

    this.method = function(anum) {
        number += anum;
    };
    this.getNumber = function() {
        var fnumber = number + 2;
        return fnumber;
    };
};

var child_class = function(num1, num2) {
    var sum = num1 + num2;
    parent_class.call(this, sum); // initialize parent class

    this.method = function() {
        sum -= 1;
        base.method(sum); // what to do here
    };
};

child_class.prototype = new parent_class(); // inherit from parent
child_class.prototype.constructor = child_class; // maintain new constructor

var c = new child_class(1, 4); // child_class.sum = 5, parent_class.number = 5
c.method(); // child_class.sum = 4, parent_class.number = 9
var num = c.getNumber(); // returns 11

Теперь, не объявляя и не полагаясь на методы, прототипируемые, как я могу заставить работать линию what to do here? Я понимаю, что могу вызвать this.method(); внутри child_class и сохранить его как переменную, но Я хочу переопределить методы .

Моя предыдущая тема была не очень открытой, поскольку все предполагают, что я могу просто прототипировать все или использовать частные переменные, чтобы обойти проблему. Должен быть способ сделать это без прототипирования.

Я хочу вызвать .method(); из экземпляра child_class без сохранения предыдущего .method(); как частной переменной или используя методы-прототипы, которые по понятным причинам не могут получить доступ к закрытым членам .

Ответы [ 2 ]

1 голос
/ 25 января 2012

Просто используйте прототип, вы можете пометить «приватные» свойства и методы символьным префиксом NULL или любым другим, чтобы отговорить людей использовать их, и это все, что вам действительно нужно.

MyClass.prototype = {

    "\0privateMethod": function(){}

};

Если вы используете Chrome, вы увидите это в консоли:

Object
privateMethod: function (){}
__proto__: Object

Пока нельзя myClass.privateMethod(), этого должно быть достаточно, чтобы намекнуть, что это частная собственность. Чтобы на самом деле позвонить, вам нужно написать myClass["\0privateMethod"]().

После возвращения к использованию прототипа ваша проблема должна автоматически стать легко решаемой.

1 голос
/ 25 января 2012

Вы пытаетесь превратить JavaScript во что-то, чем оно не является.

Прекратите это делать.

JavaScript наследует через прототип.Привыкайте к этому.

ADDENDUM

Хорошо, давайте уточним.

JavaScript не реализует ООП, как C ++, Java, C #, VB.NET или любой другой объектно-ориентированный язык.У вас есть прототип.Вы можете продлить прототип.Если вы хотите «переопределить метод», вам нужна ссылка на ранее существовавшую версию.

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

Пусть прототип выполнит свою работу.Любая инфраструктура, которую вы строите вокруг нее, чтобы попытаться имитировать наследование, абстрагировать базовые классы, суперклассы, а что нет, будет иметь свои собственные головные боли и станет кошмаром обслуживания.

...