是否可以使用Object.assign来克隆带有其方法的对象
Is it possible to use Object.assign to clone an object with its methods?
我想使用Object.assign
来克隆一个类的实例,包括它附带的任何方法。是否可以只使用Object.assign
,或者我应该使用类似lodash deepClone
的东西?
class Foo {
constructor() {
this.a = 1;
this.b = 2;
}
add() {
return this.a + this.b;
}
}
const foo1 = new Foo();
console.log(foo1.add());
console.log(foo1.b);
// ? Where did the add go?
const foo2 = Object.assign({}, foo1, { b: 99 });
console.log(foo2.add());
console.log(foo2.b);
示例-http://jsbin.com/dacopazanu/edit?js,控制台
Object.assign
只复制自己的可枚举属性,而继承的class
方法不是。
但你无论如何都不想复制这些——要克隆一个实例,你需要创建一个继承自同一原型的对象:
const foo2 = Object.assign(Object.create(Object.getPrototypeOf(foo1)), foo1);
答案似乎是,开箱即用,不,这是不可能的。
使用像lodash
这样有用的实用程序库,尤其是它的cloneDeep
方法,似乎是一条可靠的道路。
相关文章:
- 序列化数据属性中对象的最可靠方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 如何从对象的原型方法访问JavaScript对象属性
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- 设置嵌套对象属性的更好方法
- JQuery示例不起作用-“;对象没有't支持属性或方法'按钮'&”;
- 对象不支持属性或方法“自动完成”
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- 对象文字方法上的Javascript绑定不起作用
- Meteor应用程序无法运行-对象#<编译器>没有方法'主机'
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- Underscore.js某些对象的所有方法的总和
- 对象#<XMLHttpRequest>没有方法'完成'
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- 丢失对象“;这个“;方法中的上下文
- 如何在ajax中调用javascript对象的方法
- 为什么页面方法对象未定义
- 如何使用在另一个文件中定义的JavaScript方法/对象
- 如何告诉JsHint忽略“未解析的函数或方法”?对象上的警告
- 使用jinja/javascript动态创建方法/对象