@ckeditor/ckeditor5-utils
Version:
Miscellaneous utilities used by CKEditor 5.
51 lines (50 loc) • 1.58 kB
JavaScript
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
/**
* @module utils/mix
*/
/**
* Copies enumerable properties and symbols from the objects given as 2nd+ parameters to the
* prototype of first object (a constructor).
*
* ```
* class Editor {
* ...
* }
*
* const SomeMixin = {
* a() {
* return 'a';
* }
* };
*
* mix( Editor, SomeMixin, ... );
*
* new Editor().a(); // -> 'a'
* ```
*
* Note: Properties which already exist in the base class will not be overriden.
*
* @deprecated Use mixin pattern, see: https://www.typescriptlang.org/docs/handbook/mixins.html.
* @param baseClass Class which prototype will be extended.
* @param mixins Objects from which to get properties.
*/
export default function mix(baseClass, ...mixins) {
mixins.forEach(mixin => {
const propertyNames = Object.getOwnPropertyNames(mixin);
const propertySymbols = Object.getOwnPropertySymbols(mixin);
propertyNames.concat(propertySymbols).forEach(key => {
if (key in baseClass.prototype) {
return;
}
if (typeof mixin == 'function' && (key == 'length' || key == 'name' || key == 'prototype')) {
return;
}
const sourceDescriptor = Object.getOwnPropertyDescriptor(mixin, key);
sourceDescriptor.enumerable = false;
Object.defineProperty(baseClass.prototype, key, sourceDescriptor);
});
});
}