javascript - 使用 JavaScript 克隆实例化对象?

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

最佳答案

据我所知,没有本地或通用的方法。我更喜欢为我的伪类编写 .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 已添加的原型(prototype)属性。

Object.getPrototypeOf

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

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

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

Object.create ( supported since node V8 ) ( MDN )

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

var clone = Object.create(this);

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

.toSource ( Node.js module ) ( MDN )

有趣的是,您可以(在某些浏览器中仅限 firefox)覆盖为所有对象(甚至是 native 对象)定义的方法 .toSource:

toSource method

在某些情况下,您可能想要这样做:

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

进一步阅读

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

关于javascript - 使用 JavaScript 克隆实例化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27388077/

相关文章:

javascript - Javascript 中独立 XULRunner SDK 应用程序的内容策略 xpcom 组件

node.js - MEAN Stack : Very specific web requests to generic model methods, 或具有非常具体模型方法的通用 Web 请求?

javascript - 我无法在 .then() Promise 中返回对象

oop - 函数如何进入 Lua 中的表?

java - java中的新运算符

javascript - 油猴劫持 setInterval

javascript - jQuery 根据属性更改值

javascript - 制作响应式整页的最佳方式?

node.js - 如何配置 Visual Studio Code 以使用 Node.js

Python:在另一个类中访问一个类的属性和方法