2012-01-25 4 views
0

Я делал несколько библиотек и библиотек расширений, и мне не очень удобно использовать прототип, потому что в реальном мире у вас фактически есть частные переменные, которые делают не требуется доступ к инстанцированному объекту.JavaScript: Наследование прототипом, без использования прототипа для определения/вызова методов

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();в качестве частного переменной или с помощью методов прототипа, который, по понятным причинам, не может получить доступ к закрытым членам.

+0

Я не понимаю вопроса .. чего вы пытаетесь достичь? – c69

+0

Я положил его в жирный шрифт. –

ответ

1

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

MyClass.prototype = { 

    "\0privateMethod": function(){} 

}; 

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

Object 
privateMethod: function(){} 
__proto__: Object 

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

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

+0

Спасибо, что нашли подходящий способ подойти к моему вопросу, это работает для меня. –

1

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

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

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

ADDENDUM

Хорошо, давайте проясним.

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

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

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

+2

хотя я вроде согласен здесь, это не совсем ответ. –