Skip to content

merge

شیءها را درهم می‌آمیزد و ویژگی‌های شیء دوم را به شیء نخست می‌نویسد.

API

merge

بازگشت

آرگومانتوضیحنوع
Objectشیء درهم‌آمیخته (همان شیء نخست)Object

پارامترها

پارامترتوضیحنوعپیش‌فرض
aشیء مقصد (دگرگون می‌شود)Objectالزامی
bشیء مبدأ (ویژگی‌هایش به a نوشته می‌شود)Objectاختیاری

نمونه

کاربرد پایه

js
import { merge } from 'ranuts';

const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };

const result = merge(obj1, obj2);
console.log(result); // { a: 1, b: 3, c: 4 }
console.log(obj1); // { a: 1, b: 3, c: 4 } (شیء اصلی دگرگون شد)
console.log(result === obj1); // true (همان شیء اصلی برمی‌گردد)

درهم‌آمیختن شیءهای پیکربندی

js
import { merge } from 'ranuts';

const defaultConfig = {
  host: 'localhost',
  port: 3000,
  timeout: 5000,
};

const userConfig = {
  port: 8080,
  ssl: true,
};

const config = merge(defaultConfig, userConfig);
console.log(config);
// { host: 'localhost', port: 8080, timeout: 5000, ssl: true }

دادن تنها یک آرگومان

js
import { merge } from 'ranuts';

const obj = { a: 1 };
const result = merge(obj);
console.log(result); // { a: 1 } (همان‌طور برمی‌گردد)

یادداشت‌ها

  1. شیء اصلی را دگرگون می‌کند: به‌جای ساختن شیئی تازه، شیء نخست را مستقیم تغییر می‌دهد.
  2. آمیختن سطحی: تنها یک لایه را می‌آمیزد و به شیءهای تودرتو فرو نمی‌رود.
  3. رونویسی: اگر هر دو کلیدی یکسان داشته باشند، مقدار شیء دوم روی مقدار شیء نخست را می‌نویسد.
  4. مقدار بازگشتی: همان شیء نخست، در حالی که دگرگون شده است.

mergeExports

با آنکه نامش شبیه است، ابزاری دیگر است: به‌جای رونوشت گرفتن از مقدارهای ساده، از نقشه‌ای از گیرنده‌ها یک شیء برون‌داد تنبل‌ارزیاب و منجمد می‌سازد. هر گیرنده دست‌بالا یک بار، در نخستین دسترسی، می‌دود و از آن پس نتیجه انباره می‌شود؛ آن هم با همان پوشش once که ranuts/utils جداگانه بیرون می‌دهد. شیءهای سادهٔ تودرتو بازگشتی درهم آمیخته (و منجمد) می‌شوند؛ هر چه گیرنده یا شیء تودرتو نباشد خطا می‌دهد.

js
import { mergeExports } from 'ranuts/utils';

const lazyModule = mergeExports(
  {},
  {
    get expensive() {
      console.log('computing...');
      return heavyComputation();
    },
    nested: {
      get value() {
        return 42;
      },
    },
  },
);

lazyModule.expensive; // 'computing...' را چاپ می‌کند و سپس نتیجه را می‌دهد
lazyModule.expensive; // نتیجهٔ انباره‌شده را می‌دهد و دیگر چیزی چاپ نمی‌کند

Notes

  1. آمیختنی همه‌کاره نیست. برای مقدارهای ساده از merge استفاده کنید؛ mergeExports برای ساختن شیئی به شکل یک پیمانه است که در آن محاسبهٔ برخی ویژگی‌ها گران است و تنها اگر واقعاً خوانده شوند باید بدود.
  2. نتیجه منجمد است (Object.freeze) و هر ویژگیِ تعریف‌شده configurable: false است، پس شیء بازگشتی را نه می‌توان دوباره نسبت داد و نه ویژگی تازه‌ای به آن افزود.
  3. هر چیز دیگری خطا می‌دهد. مقداری که نه گیرنده باشد و نه شیء سادهٔ تودرتو (آرایه، تابع، مقدار اولیه‌ای که مستقیم نسبت داده شده) خطای Exposed values must be either a getter or a nested object می‌دهد.

منتشرشده تحت مجوز MIT.