通过变量重新初始化javascript函数对象

通过变量重新初始化javascript函数对象,javascript,object,Javascript,Object,这一点在PHP中是相当容易做到的,我发现我自己处在一种情况下,它会派上用场,但我不相信PHP技巧会起作用 基本上,我希望使用从对象内的函数传递的变量,然后使用子对象(由变量定义)重新初始化该对象 这是一个非常早期的工作,所以请原谅它看起来很奇怪的事实(仍然需要对这个概念进行更多的修改)。但总的来说,它应该大致反映出这个概念 有没有办法用一个新函数基本上重新创建当前函数实例?要在我考虑的方面做到这一点,我需要使用一个变量,而不是传递新对象。这可能吗?我相信在某种程度上,这是必须的。有什么想法/建议

这一点在PHP中是相当容易做到的,我发现我自己处在一种情况下,它会派上用场,但我不相信PHP技巧会起作用

基本上,我希望使用从对象内的函数传递的变量,然后使用子对象(由变量定义)重新初始化该对象

这是一个非常早期的工作,所以请原谅它看起来很奇怪的事实(仍然需要对这个概念进行更多的修改)。但总的来说,它应该大致反映出这个概念

有没有办法用一个新函数基本上重新创建当前函数实例?要在我考虑的方面做到这一点,我需要使用一个变量,而不是传递新对象。这可能吗?我相信在某种程度上,这是必须的。有什么想法/建议吗?谷歌一直让我失望,因为我不确定这个关键词是否正确

编辑: 还应该展示“titleView”类背后的想法


你认为这就是你的要求吗

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 }