JSFiddle - React, Tailwind, and code Playground

JavaScript

/**
 *
 * @param {object} obj an object to set its values
 * @param {object} data an object containing the values
 * @param {string[]} names an array containing allowed names
 */
function setData(obj, data, names) {
	if (data)
		for (var i = 0; i < names.length; i++) {
			if (data.hasOwnProperty(names[i]))
				obj[names[i]] = data[names[i]];
		}
}

function Foo(data) {
	var self = {
		name: ''
	};

	setData(self, data, ['name']);

	Object.defineProperties(this, {
		Name: {
			enumerable: true,
			get: function () {
				return self.name;
			}
		}
	});
}

var Bar = (function () {
	var self = {
		name: ''
	};

	function Bar(data) {
		setData(self, data, ['name']);
	}

	Object.defineProperties(Bar.prototype, {
		Name: {
			enumerable: true,
			get: function () {
				return self.name;
			}
		}
	});

	return Bar;
})();

var Qux = (function () {
	function Qux(data) {
		this.self = {
			name: ''
		};
		setData(this.self, data, ['name']);
	}

	Object.defineProperties(Qux.prototype, {
		Name: {
			enumerable: true,
			get: function () {
				return this.self.name;
			}
		}
	});

	return Qux;
})();

var foo1 = new Foo({name: 'Foo1'});
var foo2 = new Foo({name: 'Foo2'});
console.log(foo1);
console.log(foo2);

var bar1 = new Bar({name: 'Bar1'});
var bar2 = new Bar({name: 'Bar2'});
console.log(bar1);
console.log(bar2);

var qux1 = new Qux({name: 'Qux1'});
var qux2 = new Qux({name: 'Qux2'});
console.log(qux1);
console.log(qux2);