function makeObject(vData, oKeyInfo, oScope) {
		if ( !vData || vData instanceof ManagedObject || typeof vData !== "object" || vData instanceof String) {
			return vData;
		}

		/**
		 * Retrieval of class constructor via global (class name string in dot notation).
		 * @deprecated since 1.120
		 */
		function getClass(vType) {
			if ( typeof vType === "function" ) {
				return vType;
			}
			if (typeof vType === "string" ) {
				const oType = ObjectPath.get(vType);
				if (oType != null) {
					Log.error(`Defining the object type ('${vType}') via its string name is deprecated, since it leads to accesses to the global namespace. ` +
					`The object type either stems from an explicitly given 'Type' value or was inferred from the default aggregation type. ` +
					`Please require the respective object type module beforehand. ` +
					`For control development, please also refer to the runtime metadata property 'defaultClass', which allows you to specify a default aggregation class type via constructor reference.`);
				}
				return oType;
			}
		}

		let FnClass;

		/**
		 * string notation via 'Type' (used by the deprecated JSONView).
		 * @deprecated since 1.120
		 */
		FnClass = getClass(vData.Type);

		FnClass ??= oKeyInfo?.defaultClass;

		/**
		 * The aggregation type (string) is used as a fallback in case no 'Type' is given,
		 * and no default class is defined.
		 * @deprecated since 1.120
		 */
		FnClass ??= getClass(oKeyInfo?.type);

		if ( typeof FnClass === "function" ) {
			return new FnClass(vData, oScope);
		}

		// we don't know how to create the ManagedObject from vData, so fail
		var message = "Don't know how to create a ManagedObject from " + vData + " (" + (typeof vData) + ")";
		Log.fatal(message);
		throw new Error(message);
	}
Creates a new ManagedObject from the given data.

If <code>vData</code> is a managed object already, that object is returned.
If <code>vData</code> is an object (literal), then a new object is created with <code>vData</code>
as settings.

Deprecated usage, in case the type of the object is determined:
<ul>
   <li>by a property of name <code>Type</code> (capital 'T') in the <code>vData</code></li>
   <li>by a property <code>type</code> (lower case 't') in the <code>oKeyInfo</code> object</li>
</ul>

In both cases, the type must be specified by the dot separated name of the class.

@param {sap.ui.base.ManagedObject|object} vData
  The data to create the object from. Used as constructor argument.
@param {sap.ui.base.ManagedObject.MetadataOptions.Aggregation} [oKeyInfo]
  Info object for the aggregation to which the created object will be added during an applySettings() call;
  serves as the source for determining the type of the object to be created;
  Please refer to the {@link sap.ui.base.ManagedObject.MetadataOptions.Aggregation} property 'defaultClass'
  for more information.
@param {object} [oScope]
  Scope object to resolve types and formatters in bindings
@returns {sap.ui.base.ManagedObject}
  The newly created <code>ManagedObject</code>
@throws {Error}
  When there's not enough type information to create an instance from the given data
@private