---
title: behaviors
summary: "介绍 behaviors 特性，用于实现自定义组件间的代码共享，包括属性、数据和生命周期的合并与覆盖规则。"
questions:
  - behaviors 在组件间代码共享中起什么作用？
  - 一个 behavior 可以包含哪些内容？
  - 组件引用 behavior 时如何在代码中声明？
  - 同名属性或方法在组件和 behavior 之间的覆盖规则是什么？
  - 同名数据字段是对象类型时如何处理？
  - behavior 中的生命周期函数执行顺序是怎样的？
  - 同一个 behavior 被组件多次引用时生命周期函数会执行几次？
  - behavior 之间可以互相引用吗？
---

`behaviors` 是用于组件间代码共享的特性，类似于一些编程语言中的 `mixins` 或 `traits`。

每个 `behavior` 可以包含一组属性、数据、生命周期函数和方法。组件引用它时，它的属性、数据和方法会被合并到组件中，生命周期函数也会在对应时机被调用。每个组件可以引用多个 `behavior`，`behavior` 也可以引用其它 `behavior` 。

详细的参数含义和使用，请参考 [Behavior 参考文档](/cn/miniapp/develop/miniapp/framework/api/behavior)。

## 组件中使用

组件引用时，在 `behaviors` 定义段中将它们逐个列出即可。

**示例代码：**

```js
// my-component.js
import myBehavior from 'my-behavior';
Component({
  behaviors: [myBehavior],
  properties: {
    myProperty: {
      type: String
    }
  },
  data: {
    myData: 'my-component-data'
  },
  lifetimes: {
    created: function () {
    console.log('[my-component] created')
    },
    attached: function () {
      console.log('[my-component] attached')
    },
  }
  methods: {
    myMethod: function () {
      console.log('[my-component] log by myMethod')
    },
  }
})
```

在上例中，`my-component` 组件定义中加入了 `my-behavior`，而 `my-behavior` 结构为：

- 属性：myBehaviorProperty
- 数据字段：myBehaviorData
- 方法：myBehaviorMethod
- 生命周期函数：attached、created

这将使 `my-component` 最终结构为：

- 属性：myBehaviorProperty、myProperty
- 数据字段：myBehaviorData、myData
- 方法：myBehaviorMethod、myMethod
- 生命周期函数：attached、created

当组件触发生命周期时，上例生命周期函数执行顺序为：

1. [my-behavior] created
2. [my-component] created
3. [my-behavior] attached
4. [my-component] attached

详细规则，参考 **同名字段的覆盖和组合规则**。

### 同名字段的覆盖和组合规则

组件和它引用的 `behavior` 中可以包含同名的字段，对这些字段的处理方法如下：

- 如果有同名的属性 (properties) 或方法 (methods)：

  - 若组件本身有这个属性或方法，则组件的属性或方法会覆盖 `behavior` 中的同名属性或方法。
  - 若组件本身无这个属性或方法，则在组件的 `behaviors` 字段中定义靠后的 `behavior` 的属性或方法会覆盖靠前的同名属性或方法。
  - 在前一条规则的基础上，若存在嵌套引用 `behavior` 的情况，则规则为：父 `behavior` 覆盖子 `behavior` 中的同名属性或方法。

- 如果有同名的数据字段 (data)：

  - 若同名的数据字段都是对象类型，会进行对象合并。
  - 其余情况会进行数据覆盖，覆盖规则为：组件 > 父 `behavior` > 子 `behavior`，靠后的 `behavior` > 靠前的 `behavior`。优先级高的覆盖优先级低的，排在最后的 `behavior` 为 `behavior` 中优先级最高的。

- 生命周期函数不会相互覆盖，而是在对应触发时机被逐个调用：
  - 对于不同的生命周期函数之间，遵循组件生命周期函数的执行顺序。
  - 对于同种生命周期函数，遵循如下规则：
    - `behavior` 优先于组件执行。
    - 子 `behavior` 优先于父 `behavior` 执行。
    - 靠前的 `behavior` 优先于靠后的 `behavior` 执行。
  - 如果同一个 `behavior` 被一个组件多次引用，它定义的生命周期函数只会被执行一次。
