{"ScriptPreparationCode":"function cloneSO(obj) {\r\n // Handle the 3 simple types, and null or undefined\r\n if (null == obj || \u0022object\u0022 != typeof obj) return obj;\r\n\r\n // Handle Date\r\n if (obj instanceof Date) {\r\n var copy = new Date();\r\n copy.setTime(obj.getTime());\r\n return copy;\r\n }\r\n\r\n // Handle Array\r\n if (obj instanceof Array) {\r\n var copy = [];\r\n for (var i = 0, len = obj.length; i \u003C len; i\u002B\u002B) {\r\n copy[i] = cloneSO(obj[i]);\r\n }\r\n return copy;\r\n }\r\n\r\n // Handle Object\r\n if (obj instanceof Object) {\r\n var copy = {};\r\n for (var attr in obj) {\r\n if (obj.hasOwnProperty(attr)) copy[attr] = cloneSO(obj[attr]);\r\n }\r\n return copy;\r\n }\r\n\r\n throw new Error(\u0022Unable to copy obj! Its type isn\u0027t supported.\u0022);\r\n}\r\n\r\nBang = (function () {\r\n let def = {};\r\n \r\n def.constructor = function (self) {\r\n self.foo1 = 15;\r\n self.foo2 = \u0027testing\u0027;\r\n self.foo3 = { i: 1, am: 2, a: 3, literal: 4};\r\n self.foo4 = self.foo2 \u002B self.foo1;\r\n };\r\n \r\n def.doFoo1 = function (self) {\r\n return self.foo2;\r\n };\r\n \r\n def.doFoo2 = function (self) {\r\n self.foo \u002B= 1;\r\n return self.foo1;\r\n };\r\n \r\n return function () {\r\n let self = {};\r\n def.constructor(self);\r\n return {\r\n doFoo1: def.doFoo1.bind(null, self),\r\n doFoo2: def.doFoo2.bind(null, self)\r\n };\r\n };\r\n})();\r\n\r\npreBang = Bang();\r\n\r\nfunction Foo() {\r\n let self = {};\r\n\r\n /****************************************************************************\r\n * Properties\r\n ***************************************************************************/\r\n self.foo1 = 15;\r\n self.foo2 = \u0027testing\u0027;\r\n self.foo3 = { i: 1, am: 2, a: 3, literal: 4 };\r\n self.foo4 = null;\r\n\r\n /****************************************************************************\r\n * Methods\r\n ***************************************************************************/\r\n self.constructor = function () {\r\n self.foo4 = self.foo2 \u002B self.foo1;\r\n }\r\n\r\n self.doFoo1 = function () {\r\n return self.foo2;\r\n }\r\n\r\n self.doFoo2 = function () {\r\n self.foo1 \u002B= 1;\r\n return self.foo1;\r\n }\r\n\r\n /****************************************************************************\r\n * Public Exports\r\n ***************************************************************************/\r\n self.public = {\r\n doFoo1: self.doFoo1,\r\n doFoo2: self.doFoo2\r\n }\r\n\r\n self.constructor();\r\n return self.public;\r\n}\r\n\r\npreFoo = Foo();\r\n\r\nfunction Bar() {\r\n this._foo1 = 15;\r\n this._foo2 = \u0027testing\u0027;\r\n this._foo3 = { i: 1, am: 2, a: 3, literal: 4 };\r\n this._foo4 = this._foo2 \u002B this._foo1;\r\n}\r\n\r\nBar.prototype.doFoo1 = function () {\r\n return this._foo2;\r\n}\r\n\r\nBar.prototype.doFoo2 = function () {\r\n this._foo1 \u002B= 1;\r\n return this._foo1;\r\n}\r\n\r\npreBar = new Bar();","TestCases":[{"Name":"Instantiation - Closure","Code":"let foo = Foo();","IsDeferred":false},{"Name":"Instantiation - Prototype","Code":"let bar = new Bar();","IsDeferred":false},{"Name":"Utilization - Closure","Code":"let baz = preFoo.doFoo2();","IsDeferred":false},{"Name":"Utilization - Prototype","Code":"let baz = preBar.doFoo2();","IsDeferred":false},{"Name":"Instantiation - Proxy Closure","Code":"let bang = Bang();","IsDeferred":false},{"Name":"Utilization - Proxy Closure","Code":"let baz = preBang.doFoo2();","IsDeferred":false}]}