通过变量重新初始化javascript函数对象
这一点在PHP中是相当容易做到的,我发现我自己处在一种情况下,它会派上用场,但我不相信PHP技巧会起作用 基本上,我希望使用从对象内的函数传递的变量,然后使用子对象(由变量定义)重新初始化该对象 这是一个非常早期的工作,所以请原谅它看起来很奇怪的事实(仍然需要对这个概念进行更多的修改)。但总的来说,它应该大致反映出这个概念 有没有办法用一个新函数基本上重新创建当前函数实例?要在我考虑的方面做到这一点,我需要使用一个变量,而不是传递新对象。这可能吗?我相信在某种程度上,这是必须的。有什么想法/建议吗?谷歌一直让我失望,因为我不确定这个关键词是否正确 编辑: 还应该展示“titleView”类背后的想法通过变量重新初始化javascript函数对象,javascript,object,Javascript,Object,这一点在PHP中是相当容易做到的,我发现我自己处在一种情况下,它会派上用场,但我不相信PHP技巧会起作用 基本上,我希望使用从对象内的函数传递的变量,然后使用子对象(由变量定义)重新初始化该对象 这是一个非常早期的工作,所以请原谅它看起来很奇怪的事实(仍然需要对这个概念进行更多的修改)。但总的来说,它应该大致反映出这个概念 有没有办法用一个新函数基本上重新创建当前函数实例?要在我考虑的方面做到这一点,我需要使用一个变量,而不是传递新对象。这可能吗?我相信在某种程度上,这是必须的。有什么想法/建议
你认为这就是你的要求吗
var View = function(){
this.load = function(name){
return name;
}
}
var myView = new View;
var v = myView.load('titleView');
alert(v);
我认为最简单的方法是通过某种工厂,它可以生成您想要的视图类型。大概是这样的:
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);
这将提供以下内容(允许您动态重新创建视图变量):
如果您尝试按照示例的方式进行,则必须使用如下子类:
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)
后,您的视图仍将保留调用load之前的所有属性/方法(这可能不是您想要的)。请注意:如果更改其背后的思维过程感觉更自然,请随意完全撕开我目前拥有的代码。仍然是一个很早的概念(或者很老,我只是瞎了眼)。所以最后view
应该是titleView
的一个新实例?基本上对于titleView,它将使用prototype继承view中的其他函数,所以titleView.prototype=newview代码>。PHP专门为变量使用$
,但javascript没有,这让我觉得这种方法是“错误的”或“误导的”。也许这会帮助你决定你需要做什么。我想更像是动态继承,通过一个变量,我可以轻松地动态调整它,然后重新初始化“视图”。我之所以使用函数而不是普通对象,是为了能够使用prototype创建具有相同“基本”函数但有一些额外/修改的函数的新对象。但是谢谢你的链接,我会仔细阅读它。^^。你仍然会得到一个“字符串不是函数”错误你的小提琴/和编辑过的代码只是返回了stringpass in obj get out obj,你的例子传入strMy example?这不是我的问题。。。我只是让你知道你的代码中的错误,如果你显示传入一个字符串,任何看到这个答案的人都会认为他们应该能够传入一个字符串。还要注意的是,即使您传递了一个对象,您当前的代码仍将返回它,我认为您希望返回新名称代码>这并不重要,因为OP想要继承,这不做任何类型的继承,这有点超出我的范围,朋友,但我挖掘问题,将观看这一个…完美!解释得也不错。这使得load
功能是动态的,没有任何问题。
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);
// 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 }