js深浅拷贝, 讨论在函数返回obj时是否需要解决浅拷贝问题
结论 需要
- js函数是浅拷贝确定无疑, 没想到 经过函数返回的数据也是浅拷贝.
- 所以想像其他语言那样 provice 变量 有点困难, 需要先解除浅拷贝后返回, 否则变量污染依然存在
// js obj浅拷贝测试
var person = new Object();
person.name = 'abc';
person.obj = new Object({
name: 'bcd'
});
person.fun = function() {
// test 1
// return this.name;
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// test 2
return this.obj;
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
}
// test 1
// console.log('person.name', person.name);
// var name = person.fun();
// console.log('name', name);
// name = '222';
// console.log('name', name);
// console.log('person.name', person.name);
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// test 2
console.log('person.obj', person.obj);
var name = person.fun();
console.log('name', name);
name.name = '222';
console.log('name', name);
console.log('person.obj', person.obj);
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
以上问题讨论的浅拷贝导致的 可以用原生方案解决(目前没实测)
js高级程序设计=>第六章 面向对象=>6.1.1 属性类型 中有提到
js 中对象的属性分为 数据属性, 访问器属性(表示细节没看懂, 不过大概了解了)
Configurable(是否可通过 delete 删除属性而重新定义属性 默认: true)
Enumerable(是否可被 for-in 所循环 默认: true)
Writable(是否可以直接修改值 默认: true)
Value(看个大概, 没啥用, 就是数据操作函数罢了, 不需要懂)
// 大概这么写, 知道就好, 并无多大卵用. 只是可以解决 该文件提到的问题而已
// ** 问题 改函数属性可否 被其 子对象所继承 并无尝试, 等到用的时候再说吧
Object.defineProperty(<Object>, <key>, {
configurable: false,
})
继续上一个 可以用原生解决 赋值校验问题了
Object.defineProperty(<Object>, <key>, {
get: function(key) {
// 解决 浅拷贝问题
if (this[key]) {
let res = JSON.parse(JSON.stringify(this[key]))
return res;
}
else {
return undefined;
}
},
set: function(newValue) {
// 不管 就是数据类型 匹配 父类设置的属性 然后判断可不可以赋值
}
})

浙公网安备 33010602011771号