Javascript中的内置构造函数函数
Built in Constructor functions in Javascript
当我这样做时:
var person = new Object();
person.name = "alex";
console.log(person)
输出为:
Object { name="alex"}
然而,说我放弃"新"字,然后做:
var person = Object();
person.name = "alex";
console.log(person)
输出也是:
Object { name="alex"}
为什么?
因为一些内置函数就是这样定义的。例如,Object
:见ES5 15.2.1.1
15.2.1.1对象([值])
当
Object
函数在没有参数或只有一个参数值的情况下调用时,将采取以下步骤:
- 如果值为
null
、undefined
或未提供,则创建并返回一个新的Object对象,就像用相同的参数调用标准内置Object构造函数一样(15.2.2.1)- 返回
ToObject(value)
他们测试自己是否被new
调用过,如果没有,就表现得像被new
调用过一样。
并不是所有的构造函数都是这样工作的。例如,当在没有new
的情况下调用时,Date
将返回一个字符串。
你可以自己实现:
function Foo() {
if(!(this instanceof Foo)) {
return new Foo();
}
// do other init stuff
}
Foo()
和new Foo()
将以相同的方式进行操作(不过,使用可变参数会变得更加棘手)。
由于您的示例是一个Object类型的内置函数,正如上面所回答的,它对该类型是相同的,因此它对大多数其他内置函数(如Number())的工作方式不同。无论是否使用"new"关键字调用它们,都应该非常小心。因为默认情况下,带有函数构造函数的"new"关键字返回对象,而不是直接返回基元类型。因此,例如,您不能检查两个变量的严格相等性,其中一个变量是使用new Number()
声明和分配的,另一个变量使用Number()
例如:
var num1 = Number(26);
var num2 = new Number(26);
num1 == num2; // returns true
num1 === num2; // returns false
您可以在控制台日志中检查差异:
console.log(num1);
> 26
console.log(num2);
> Number {26}
> __proto__: Number
> [[PrimitiveValue]]: 26
相关文章:
- 构造函数函数闭包变量
- 构造函数函数中的自执行函数的OO上下文/范围
- 为什么在构造函数函数中使用此关键字
- 正在将构造函数函数迁移到TypeScript
- 获取构造函数函数的最佳方式是在JavaScript中使用带名称空间的字符串表示
- 为什么可以't我使用'var'在构造函数函数中
- 获取自定义对象构造函数函数名
- 在构造函数函数中创建只读(get)属性
- 正在检查类型构造函数函数
- Javascript中的内置构造函数函数
- 如何在JavaScript中的函数(函数本身就是一个参数)中传递参数
- 构造函数函数原型可枚举
- 为什么要设置原型's构造函数转换为其构造函数函数
- 从另一个javascript程序调用函数-函数式编程
- 构造函数函数.可以't覆盖对全局变量的引用
- 使用构造函数函数的Javascript继承
- 从数组构造生成器函数
- 如何创建DOM's构造函数函数
- 使用构造函数函数添加和删除项的数据结构
- 在NodeJS中构造helper函数的最佳方式