code: function (O, defaultConstructor) {
  		// 7.3.20.1 Assert: Type(O) is Object.
  		if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
  			throw new TypeError('Assertion failed: Type(O) is not Object');
  		}
  		// 7.3.20.2 Let C be ? Get(O, "constructor").
  		var C = O.constructor;
  		// 7.3.20.3 If C is undefined, return defaultConstructor.
  		if (typeof C === 'undefined') {
  			return defaultConstructor;
  		}
  		// 7.3.20.4 If Type(C) is not Object, throw a TypeError exception
  		if (!C || (typeof C !== 'object' && typeof C !== 'function')) {
  			throw new TypeError('O.constructor is not an Object');
  		}
  		// 7.3.20.5 Let S be ? Get(C, @@species).
  		var S = typeof Symbol === 'function' && typeof Symbol.species === 'symbol' ? C[Symbol.species] : undefined;
  		// 7.3.20.6 If S is either undefined or null, return defaultConstructor.
  		if (S === undefined || S === null) {
  			return defaultConstructor;
  		}
  		// 7.3.20.7 If IsConstructor(S) is true, return S.
  		if (typeof S === 'function' && S.prototype) {
  			return S;
  		}
  		// 7.3.20.8 Throw a TypeError exception.
  		throw new TypeError('no constructor found');
  	}
docs: 7.3.20 SpeciesConstructor(O, defaultConstructor)