用JavaScript克隆实例化对象?

时间:2014-12-09 20:19:59

标签: javascript node.js oop object

无法找到解决JavaScript中克隆实例化对象的答案。克隆现有实例化对象的最佳方法是什么?如,

function Person() {
}

Person.prototype.setName = function(name) {
    this.name = name;
}

var person = new Person();
person.setName('Charles Xavier');

function cloneInstantiated(instantiatedObject) {
    var clone = ... new Person ... ????

    return clone;
}

var clone = cloneInstantiated(person);

console.log(clone.name); // Charles Xavier

if(clone !== person) {
    console.log('Success! We have cloned Charles Xavier into a different memory address.');
}

2 个答案:

答案 0 :(得分:2)

据我所知,目前还没有本土或普遍的方式。我更喜欢为我的伪类编写.clone方法并使用它:

Person.prototype.clone = function() {
    var clone = new Person()
    clone.name = this.name;
}

你可以遍历对象的自有属性来克隆它们,而不是复制从其他对象继承的东西:

for(var i in this) {
   if(this.hasOwnProperty(i)) {
       clone[i] = this[i];
   }
}

这会复制实例化后添加到对象中的所有内容(例如,通过调用new Person来复制已经添加的原型属性。

Object.getPrototypeOf

thanks to Bergi
此方法允许您检索任何对象的原型。因此,您可以使用以下new Name代替:

var clone = Object.create(Object.getPrototypeOf(this))

这是一个可以为您节省大量工作的通用解决方案。然后,您必须使用for(var i in ...)继续复制自己的属性。

Object.createsupported since node V8)(MDN

最后,您可以创建一个继承原始对象的人:

var clone = Object.create(this);

这在特殊情况下很有用,但通常我不会推荐它。

.toSourceNode.js module)(MDN

知道你可以(在某些浏览器 firefox中)覆盖为所有对象定义的方法.toSource,甚至是本地对象,这也很有趣:

toSource method

在某些情况下,您可能希望这样做:

Person.prototype.toSource = function() {
    //Assuming name can be given in constructor
    return "new Person("+this.name.toSource()+")";
}

进一步阅读

除了链接的文档,我发现这篇关于javascript对象继承的好文章:

答案 1 :(得分:0)

这很有效...... Fiddle

function Person() {
}

Person.prototype.setName = function(name) {
    this.name = name;
}

var person = new Person();
person.setName('Charles Xavier');

function cloneInstantiated(instantiatedObject) {
    var clone = {};
    for (key in instantiatedObject) {
        clone[key] = instantiatedObject[key];
    }
    return clone;
}

var clone = cloneInstantiated(person);

console.log(clone.name); // Charles Xavier

if(clone !== person) {
    console.log('Success! We have cloned Charles Xavier into a different memory address.');
}