JavaScript:原型继承,不使用原型来定义/调用方法

时间:2012-01-25 17:42:55

标签: javascript class function inheritance prototype

我一直在制作几个库和扩展库,但是对我来说使用原型并不实际,因为在现实世界中,你实际上有一些不需要从实例化对象访问的私有变量。

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行生效?我知道我可以在child_class中调用this.method();并将其存储为变量,但是我想要可覆盖的方法

我之前的主题并非即将发布,因为每个人都认为我可以将所有内容原型化或使用私有变量来解决问题。必须有一种方法可以在没有原型设计的情况下做到这一点。

我想在 .method(); 的实例中调用 child_class ,而不存储以前的 {{1 }} 作为私有变量或使用原型方法,由于显而易见的原因,无法访问私有成员

2 个答案:

答案 0 :(得分:1)

你正在尝试将JavaScript变成不是的东西。

停止这样做。

JavaScript通过原型继承。习惯它。

<强>附录

好的,我们澄清一下。

JavaScript不实现OOP,如C ++,Java,C#,VB.NET或任何其他面向对象的语言。你有原型。您可以扩展原型。如果要“覆盖方法”,则需要引用以前存在的版本。

现在,需要注意的是,任何人都可以随时随地更换任何东西。因此,关于对象模型稳定性的任何假设都是最脆弱的。

让原型完成它的工作。你围绕它构建的任何框架试图模仿继承,抽象基类,超类,什么不是,都会有自己的头痛并成为维护的噩梦。

答案 1 :(得分:1)

只需使用原型,您可以使用NULL字符前缀标记“私有”属性和方法或任何阻止人们使用它们的方法,这是您真正需要的。

MyClass.prototype = {

    "\0privateMethod": function(){}

};

如果你正在使用chrome,你会在控制台中看到这个:

Object
privateMethod: function (){}
__proto__: Object

然而有人不能做myClass.privateMethod(),这应该足以暗示这是一个私人财产。要实际调用它,您需要编写myClass["\0privateMethod"]()

回到使用原型后,您的问题应该会自动变得容易解决。