深拷贝在 js 里面的含义是否应该包含__proto__的拷贝? - V2EX
Home
Sign Up
Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
V2EX
程序员
深拷贝在 js 里面的含义是否应该包含__proto__的拷贝?
deepkolos
deepkolos
Jul 12, 2017
3635 views
This topic created in 3229 days ago, the information mentioned may be changed or developed.
还是__proto__的拷贝应该归类为继承?
拷贝
proto__
归类
含义
10 replies
2017-08-13 08:26:27 +08:00
1
deepkolos
OP
Jul 12, 2017
function 是不是应该当作标量?
2
zoffy
Jul 12, 2017
3
Sapp
Jul 13, 2017
你的意思是,a = { x: 1 } 和 b = { x: 2, c: 3 } 的 __proto__ 是不一样的?都是继承自 Object.prototype,你给拷贝了干嘛?
4
joeychon
Jul 13, 2017
1
deep copy 也就是 deep clone。deep copy 按照我的理解是要 copy 对象的 prototype 的,当然这是对于用户定义 prototype 对象来说的,built-in 对象不需要拷贝。需要注意的是,由于闭包和私有变量,js 是不支持深度复制的,换句话说,用 js 无法真正实现 deep clone, 尤其是在用那些深度复制的方法时应该意识到这点。
5
deepkolos
OP
Jul 13, 2017
@
Sapp
主要是有些小的工具函数不想直接挂在 Array.prototype/Object.prototype 上面 , 所以深拷贝对象的时候 , 如果不复制__proto__的话就需要手动复制一遍先得有点别扭~~
6
deepkolos
OP
Jul 13, 2017
@
deepkolos
那个`function 是不是应该当作标量?`
表达的意思有点不对 , 是复制 function 的时候需不需要使用 new Function(func.troSource())来复制 ?
7
joeychon
Jul 13, 2017
@
deepkolos
我不知道你想表达什么,new Function(func.toSource())是伴随信息损失的,打个比方:
function afunc(){};
afunc.x = "hello";
经过你的复制,afunc.x 就没了。深度克隆的话只能用递归方法复制 func。
8
deepkolos
OP
Jul 13, 2017
@
joeychon
学到了~
9
riophae
Aug 13, 2017
可能挖坟了,不过看到这个问题忍不住想说点啥。
建议楼主去看看 underscore/lodash 这类工具库模块的实现,比较严谨。参考它们的实现是没错的,它们都是深思熟虑过的产物,而且经过了时间考验。
https://lodash.com/docs/4.17.4#cloneDeep
10
deepkolos
OP
Aug 13, 2017
@
riophae
谢谢~ 看文档里说是跟寻 Structured_clone_algorithm 的规范来走的, 按照规范来走的话, function 不属于被 clone 的范围了 , 即便是 object 的 clone, 也只是 clone plain object . 还是谢谢建议~
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm
About
Help
Advertise
Blog
API
FAQ
Solana
2975 Online
Highest 6679
Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 41ms
UTC 13:11
PVG 21:11
LAX 06:11
JFK 09:11
Do have faith in what you're doing.
ubao
msn
snddm
index
pchome
yahoo
rakuten
mypaper
meadowduck
bidyahoo
youbao
zxmzxm
asda
bnvcg
cvbfg
dfscv
mmhjk
xxddc
yybgb
zznbn
ccubao
uaitu
acv
GXCV
ET
GDG
YH
FG
BCVB
FJFH
CBRE
CBC
GDG
ET54
WRWR
RWER
WREW
WRWER
RWER
SDG
EW
SF
DSFSF
fbbs
ubao
fhd
dfg
ewr
dg
df
ewwr
ewwr
et
ruyut
utut
dfg
fgd
gdfgt
etg
dfgt
dfgd
ert4
gd
fgg
wr
235
wer3
we
vsdf
sdf
gdf
ert
xcv
sdf
rwer
hfd
dfg
cvb
rwf
afb
dfh
jgh
bmn
lgh
rty
gfds
cxv
xcv
xcs
vdas
fdf
fgd
cv
sdf
tert
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
sdf
shasha9178
shasha9178
shasha9178
shasha9178
shasha9178
liflif2
liflif2
liflif2
liflif2
liflif2
liblib3
liblib3
liblib3
liblib3
liblib3
zhazha444
zhazha444
zhazha444
zhazha444
zhazha444
dende5
dende
denden
denden2
denden21
fenfen9
fenf619
fen619
fenfe9
fe619
sdf
sdf
sdf
sdf
sdf
zhazh90
zhazh0
zhaa50
zha90
zh590
zho
zhoz
zhozh
zhozho
zhozho2
lislis
lls95
lili95
lils5
liss9
sdf0ty987
sdft876
sdft9876
sdf09876
sd0t9876
sdf0ty98
sdf0976
sdf0ty986
sdf0ty96
sdf0t76
sdf0876
df0ty98
sf0t876
sd0ty76
sdy76
sdf76
sdf0t76
sdf0ty9
sdf0ty98
sdf0ty987
sdf0ty98
sdf6676
sdf876
sd876
sd876
sdf6
sdf6
sdf9876
sdf0t
sdf06
sdf0ty9776
sdf0ty9776
sdf0ty76
sdf8876
sdf0t
sd6
sdf06
s688876
sd688
sdf86