怎么拷贝一个js函数或者对象的方法

这篇文章写的东西比较渣,大佬可以自动忽略。

众所周知:js有深拷贝和浅拷贝的区别。之前写js深拷贝的时候一直用var copyObj = JSON.parse(JSON.stringify(obj));
但是后来发现JSON.stringify() 有以下几个特点:

  • 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
  • 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
  • undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)
  • 或者被转换成 null(出现在数组中时)。
  • 所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。
  • 不可枚举的属性会被忽略

其他几点这里不做讨论,感兴趣的亲可以自己去尝试。唯独对于会忽略任意函数这个特点感觉比较不爽,于是就想用for in自己实现能拷贝对象的方法的深拷贝。(这里不写怎么深拷贝,感兴趣的亲可以自己用递归实现。)

怎么拷贝一个js函数或者对象的方法_第1张图片

这样看起来是把对象obj的方法m拷贝了,可是m是一个引用类型的变量,这样写也只是引用了m的一个地址。当我们改变copyObj.m时,原始对象obj.m也会受到影响。就将事儿的:

怎么拷贝一个js函数或者对象的方法_第2张图片

而这个肯定不是我们所希望看到的。辣么问题来了,怎么从真正意义上拷贝方法呢?
在下愚钝,想了3s钟终于想出来了,把它转成字符串,然后把字符串再转成方法不就好了么?心动不如行动,那就赶紧try try吧。

怎么拷贝一个js函数或者对象的方法_第3张图片

酱紫才算是真正的拷贝过来了,而不只是复制了它的引用地址。同理:拷贝一个函数,而不只是复制他的引用地址,也可以酱紫做。开森!!


你可能感兴趣的:(怎么拷贝一个js函数或者对象的方法)