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) {
             // 不管 就是数据类型 匹配 父类设置的属性 然后判断可不可以赋值
      }
})
posted @   qoon  阅读(130)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示