gpt4 book ai didi

javascript - 闭包对象的继承和方法的重写

转载 作者:行者123 更新时间:2023-11-30 18:54:50 25 4
gpt4 key购买 nike

我需要扩展一个封装在闭包中的类。这个基类如下:

var PageController = (function(){

// private static variable
var _current_view;

return function(request, new_view) {
...

// priveleged public function, which has access to the _current_view
this.execute = function() {
alert("PageController::execute");
}

}
})();

使用以下函数实现继承:

function extend(subClass, superClass){
var F = function(){
};
F.prototype = superClass.prototype;
subClass.prototype = new F();
subClass.prototype.constructor = subClass;
subClass.superclass = superClass.prototype;
StartController.cache = '';


if (superClass.prototype.constructor == Object.prototype.constructor) {
superClass.prototype.constructor = superClass;
}
}

我将 PageController 子类化:

var StartController = function(request){
// calling the constructor of the super class
StartController.superclass.constructor.call(this, request, 'start-view');
}
// extending the objects
extend(StartController, PageController);

// overriding the PageController::execute
StartController.prototype.execute = function() {
alert('StartController::execute');
}

继承正在发挥作用。我可以从 StartController 的实例调用每个 PageController 的方法。但是,方法覆盖不起作用:

var startCont = new StartController();
startCont.execute();

警告“PageController::execute”。我应该如何覆盖此方法?

最佳答案

它不起作用,因为 StartController电话 PageController添加了一个 execute属性给你的对象,所以 execute StartController.prototype的属性(property)未使用。

要使覆盖工作,您必须:

1) 定义PageController.prototype.execute作为 execute PageController的方法| .它不会工作,因为函数无法访问 _current_view .

2) 定义StartController.execute在对象构造函数中:

var StartController = function(request){
// calling the constructor of the super class
StartController.superclass.constructor.call(this, request, 'start-view');
// overriding the PageController::execute
this.execute = function() {
alert('StartController::execute');
}
}
// extending the objects
extend(StartController, PageController);

编辑:

所以你想要 StartController.execute访问 _current_view , 这是不可能的,只要 _current_view是闭包的一部分 StartController不是的一部分。您可能需要这样进行:

(function () {
var _current_view;
window.PageController = function(request, new_view) {
...
this.execute = function() { ... }
}

window.StartController = function(request) {
StartController.superclass.constructor.call(this, request, 'start-view');
this.execute = function() { ... }
}
extend(StartController, PageController);

}()
var startCont = new StartController();
startCont.execute();

如果你想要某种 protected 行为,你可能想试试这个技巧:

(function() {
var token = {};

window.Class1 = function() {
this.protectedMethod = function(tok) {
if(tok != token) return; // unauthorized
...
}
}

window.Class2 = function() {
new Class1().protectedMethod(token); // access granted
}
})()

new Class1().protectedMethod(); // access denied

javascript 中没有包这样的东西,所以你的可能性是有限的。您当然不能在不属于同一脚本的函数/对象/构造函数之间拥有任何特权。至少我不知道。除了可能向服务器查询某种授权。

关于javascript - 闭包对象的继承和方法的重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2470786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com