2012-01-25 60 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线工作?我知道我可以在child_class中调用this.method();并将其作为变量存储,但我想覆盖方法

我之前的话题并不是非常即兴,因为每个人都认为我可以对所有东西进行原型设计或使用私有变量来解决问题。没有原型就必须有一种方法来做到这一点。

我想打电话从child_class实例内.method();而不存储以前.method();为私有变量或使用,出于显而易见的原因,不能访问私有成员原型方法。

+0

我不明白这个问题..你想达到什么目的? – c69

+0

我把它放在漂亮的粗体字体中。 –

回答

1

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

MyClass.prototype = { 

    "\0privateMethod": function(){} 

}; 

如果您使用Chrome,你会看到这个控制台:

Object 
privateMethod: function(){} 
__proto__: Object 

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

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

+0

感谢您找到接近我问题的足够接近的方式,这对我很有用。 –

1

您正试图将JavaScript变成不是。

停止这样做。

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

附录

好吧,让我们来澄清。

JavaScript没有像C++,Java,C#,VB.NET或任何其他面向对象语言一样实现OOP。你有原型。你可以扩展原型。如果你想“重写一个方法”,你需要参考以前存在的版本。

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

让原型做它的工作。任何你为了模仿继承,抽象基类,超类以及什么都没有的框架而构建的框架,都会有它自己的头痛,并成为维护的噩梦。

+2

尽管我有点同意这不是一个真正的答案。 –