这在 PHP 中相当容易完成,我发现自己处于一种可以派上用场的情况,但我不相信 PHP 技巧会起作用。
基本上,我想使用从对象内的函数传递的变量,然后使用子对象(由变量定义)重新初始化该对象。
var View = function(){
var fn = this;
fn.load = function(name){
return new name();
}
}
var view = View.load('titleView');
这是一个非常早期的工作,所以请原谅它看起来很奇怪的事实(仍然需要更多地修改这个概念)。但总的来说,它应该大致展示了这个概念。
有没有一种方法可以使用新函数重新创建当前函数实例?要在我想到的方面做到这一点,我需要使用变量而不是传递新对象。这可能吗?我确信它必须以某种形式存在。有什么想法/指示吗?由于我不确定正确的关键字,Google 一直让我失望。
编辑: 还应该显示“titleView”类背后的想法
var titleView = function(){}
titleView.prototype = new View;
最佳答案
我认为最简单的方法是通过某种可以生成您想要的 View 类型的工厂。像这样的事情:
var View = (function() {
var registry = {};
return {
register: function(type, fn) {
if (typeof registry[type] === 'undefined') {
registry[type] = fn;
return true;
}
return false;
},
load: function(type) {
return new registry[type]();
}
};
})();
var titleView = function() {
this.name = 'titleView';
};
var subTitleView = function() {
this.name = 'subTitleView';
}
View.register('titleView', titleView);
View.register('subTitleView', subTitleView);
var view = View.load('titleView');
console.log("Created view type: " + view.name);
view = View.load('subTitleView');
console.log("Created view type: " + view.name);
这将给出以下内容(允许您动态重新创建view
变量):
// Created view type: titleView
// Created view type: subTitleView
如果您尝试按照示例的方式进行操作,则必须使用如下子类:
function Base() {
this.name = "Base";
this.load = function(fn) {
fn.apply(this);
}
}
function Other() {
Base.apply(this, arguments);
this.name = "Other";
}
var view = new Base();
console.log(view);
view.load(Other);
console.log(view);
// => Base { name: "Base", load: function }
// => Base { name: "Other", load: function }
但是,使用此方法,在调用 view.load(Other)
后,您的 View 仍将保留在调用 load 之前拥有的任何属性/方法(这可能不是您想要的想要)。
关于javascript - 通过变量重新初始化 JavaScript 函数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24583261/