【发布时间】:2017-08-22 05:25:38
【问题描述】:
我正在尝试找到一种在 ES6 中创建 simili-abstract 类的方法。到目前为止,我尝试的所有事情总是会遇到语言和/或其语法的限制(也是我对原型设计的有限知识)。
基本循环;我们声明一个类并扩展它。最后一个类必须访问其超类中的一些字段和方法,但不是全部。它还变形了公共方法...
类声明应该是一个完美的封装,所以只有这段代码才能访问它(类似于命名空间)。
到目前为止,我在 ES5 中的实验是错误的……我非常感谢一些建议和帮助。
(function(){
// ==================================
function AbstractClass(params) {
var _myParams = params;
var _privateField = "Only AbstractClass can see me";
this.publicField = "Everybody can see me";
function privateFunc() {
// Does private stuff
}
}
AbstractClass.prototype.publicFunc = function() {
// Does public stuff
privateFunc(); // Works?
}
// ==================================
function FinalClass(params) {
// How to pass the params to the superclass?
}
FinalClass.prototype.publicFunc = function() {
// Override and calls the superclass.publicFunc()?
// How can I touch _privateField ? publicField ?
}
FinalClass.prototype = Object.create(AbstractClass.prototype);
// ==================================
var foo = new FinalClass("hello world!");
foo.publicFunc();
})();
您能告诉我这段代码有什么问题以及如何解决吗?
额外问题:如何在 ES6 中正确执行此操作?
三重奖励:受保护的字段和方法呢?
谢谢。
【问题讨论】:
-
"类声明应该是完美的封装" - JS 提供的唯一完美的封装是作用域(ES6 对此没有任何改变)。跨度>
-
“类声明应该在一个完美的封装中”——那是不可达的(?)。您始终可以使用monkeypatch 运行时来公开您想要的任何内容。使用该语言的强项可能是合理的,而不是与之抗争并从其他不适合的语言中引入习语。
-
JS 中的“正确方法”是不要试图模拟抽象类、最终类或方法以及私有/受保护成员。
-
@GuillaumeF。我不知道你所说的“simili-abstract”是什么意思,但是 JS can do abstract classes
-
@GuillaumeF。是的是的。不,你仍然可以扩展它们,虽然它很丑。
标签: javascript ecmascript-6 prototype ecmascript-5