1

我想要做的是为 Javascript 对象构建一个 clone() 函数。如您所知,Javascript 中缺少本机功能可能会很痛苦。我有一个很好的方法来做到这一点,但在可用性方面,这很尴尬。这是到目前为止的功能:

function clone(objectToClone) {
    var myClone = function() {};
    myClone.prototype = objectToClone;
    return [
        new myClone(),
        new myClone()
    ];
}

如您所见,目前我只返回一个包含两个克隆的数组。这使得用法看起来像这样:

// usage
var bar = new foo();
bar = clone(bar); // forks bar into two separate copies of bar (awkward)
// bar[0] is now clone 1
// bar[1] is now clone 2

我想做的是能够执行以下操作:

function clone(objectToClone) {
    var myClone = function() {};
    myClone.prototype = objectToClone;
    objectToClone = new myClone(); // somehow magically?
    return new myClone();
}

// usage
var bar = new foo();
var baz = clone(bar); // returns a copy, and bar is now one of the copies as well.
// bar is now clone 1
// baz is now clone 2

不幸的是,这不起作用,因为分配参数不会影响调用范围。我希望有人可以帮助想出一些 js 技巧,让我可以在所需的庄园中使用该功能。任何想法都非常感谢。

4

3 回答 3

0

你想让我解释我的评论,给你:

function replaceClones(){
    for(var i = 0; i < arguments.length; i++){
        var varName = arguments[i];
        this[varName] = getClone(this[varName]);
    }    
}

function getClone(obj){
    var Clone = function(){};
    Clone.prototype = obj;
    return new Clone();
}

replaceClones("varA","varB");

如果你想要另一个范围,只需使用

replaceClones.call(newScope,"varA","varB");
于 2012-04-26T22:59:15.040 回答
0

您可以让您的克隆函数返回副本,而保留原件。

如果由于某种原因这是不可能或不切实际的,那是你能做的最好的事情:

var bar = new foo();
var clones = clone(bar);
bar = clones[0];
barCopy = clones[1];

除非你诉诸极其不雅的eval诡计。

我认为你真正想要的是只return new myClone()使用并且从不使用bar. 这实际上使事情变得更加优雅(bar_template如果需要,您可以调用它或其他名称),因为您现在可以克隆原始模板。

于 2012-04-26T22:41:58.800 回答
0

为了得到你想要的结果,你需要传入一个带有属性的对象,然后修改这些属性。这是在允许您更改原始文件的 javascript 中获取参考的最佳方式。当它只是作为普通函数参数传递时,您无法更改原始文件。Javascript 没有这些类型的引用。

function clone(holder) {
    var myClone = function() {};
    myClone.prototype = holder.input;
    holder.input = new myClone(); // somehow magically?
    return new myClone();
}

// usage
var holder = {};
var holder.input = new foo();
var holder.output = clone(holder); // returns a copy, and holder.input is now a copy too
// holder.input is now clone 1
// holder.putput is now clone 2
于 2012-04-26T23:14:38.733 回答