Sendable对象冻结
============

Sendable对象支持冻结操作。冻结后，对象变为只读，不能修改属性。因此，多个并发实例间访问时无需加锁。可以通过调用[Object.freeze](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)接口冻结对象。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/87/v3/STk4Cm8PTfCpyHe-Zr_MBA/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073247Z&HW-CC-Expire=86400&HW-CC-Sign=C8C03E2ED3687D220AE78467D212B5B124FDAA7CBF13D18A0513851BA9754A9D)

不支持在.ets文件中使用Object.freeze接口。

#### 使用示例

1.  提供ts文件封装Object.freeze方法。
    
    export function freezeObj(obj: any) {
      Object.freeze(obj);
    }
    
2.  调用freeze方法冻结对象，然后将其发送到子线程。
    
    import { freezeObj } from './helper';
    import { worker } from '@kit.ArkTS';
    @Sendable
    export class GlobalConfig {
      // 一些配置属性与方法
      init() {
        // 初始化相关逻辑
        freezeObj(this); // 初始化完成后冻结当前对象
      }
    }
    
    @Entry
    @Component
    struct Index {
      @State message: string = 'Sendable freezeObj Test';
    
      build() {
        RelativeContainer() {
          Text(this.message)
            .id('HelloWorld')
            .fontSize(50)
            .fontWeight(FontWeight.Bold)
            .alignRules({
              center: { anchor: '\_\_container\_\_', align: VerticalAlign.Center },
              middle: { anchor: '\_\_container\_\_', align: HorizontalAlign.Center }
            })
            .onClick(() => {
              let gConifg = new GlobalConfig();
              gConifg.init();
              const workerInstance = new worker.ThreadWorker('entry/ets/workers/Worker.ets', { name: 'Worker1' });
              workerInstance.postMessage(gConifg);
              this.message = 'success';
            })
        }
        .height('100%')
        .width('100%')
      }
    }
    
3.  子线程直接操作对象，不加锁。
    
    import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
    // import { GlobalConfig } from '../pages/Index';
    import { GlobalConfig } from '../managers/SendableFreeze';
    
    const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
    workerPort.onmessage = (e: MessageEvents) => {
      let gConfig: GlobalConfig = e.data;
      // 使用gConfig对象
    }