Javascript 是否可以重新创建;新";JS中的操作员?
我最近读了这本书,书中简洁的描述让我印象深刻: 当执行代码new Foo(…)时,会发生以下情况:Javascript 是否可以重新创建;新";JS中的操作员?,javascript,reflection,Javascript,Reflection,我最近读了这本书,书中简洁的描述让我印象深刻: 当执行代码new Foo(…)时,会发生以下情况: 将创建一个从Foo.prototype继承的新对象 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象新Foo等同于 new Foo(),即如果未指定参数列表,则调用Foo 没有争论 构造函数返回的对象成为整个新表达式的结果。如果构造函数没有 显式返回一个对象,使用在步骤1中创建的对象 相反(通常构造函数不返回值,但它们可以 如果要覆盖普通对象创建,请选择这样做 过程。) 这些似乎都不是特
new Foo()
,即如果未指定参数列表,则调用Foo
没有争论new
的操作
请注意,我不计算,因为它的定义是“作为一个函数,它的行为类似于新操作符”。此函数几乎重新创建了
Reflect.construct
,因此new
(除了construct
的最后一个参数,它在使用new
操作符时没有等价物:
function fauxNew (constructor, args) {
// allocate a new object and set the prototype
var newObject = Object.create(constructor.prototype)
// call the constructor with "this" bound to the new object
var retVal = constructor.apply(newObject, args || [])
// if the constructor returned an object, return it;
// otherwise return the new object
var constructorReturnedAnObject =
!!retVal && ["object", "function"].indexOf(typeof retVal) !== -1
return constructorReturnedAnObject? retVal : newObject
}
以下是。在检测对象时不要信任
typeof
。对于不可调用的非标准外来对象,它可能会返回奇怪的东西,例如“未知”
对象(retVal)===retVal
更可靠。请注意,由于ES6必须使用Reflect.construct
,以上描述来自ES5。使用class
语法定义的一些内置和构造函数确实区分了作为构造函数调用和作为方法调用。