繁体   English   中英

使用JavaScript克隆实例化的对象?

[英]Clone an instantiated object with JavaScript?

找不到有关在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.');
}

据我所知,没有原生或通用的方法。 我更喜欢为伪类编写.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

感谢Bergi
此方法使您可以检索任何对象的原型。 因此,而不是new Name ,你可以使用:

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

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

Object.create从节点V8开始受支持 )( MDN

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

var clone = Object.create(this);

在特殊情况下这可能很有用,但通常我不建议这样做。

.toSourceNode.js模块 )( MDN

知道您可以( 在某些浏览器中 仅限firefox)覆盖方法.toSource ,该方法为所有对象(甚至本机对象)定义:

toSource方法

在某些情况下,您可能需要执行以下操作:

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

进一步阅读

除了链接的文档外,我还找到了这篇有关javascript对象继承的不错的文章:

这工作完全... 小提琴

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.');
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM