像String和Number等对象被认为是"构造函数"?

时间:2014-07-02 20:32:47

标签: javascript

我已经阅读了几个星期的教程,而且我刚刚发现,当我在构造函数上使用prototype属性时,该prototype属性上的键/值对被复制到新实例化对象的 proto 属性。

function F(){};
F.prototype.k = "v";
console.dir(F.k)//logs "undefined"
console.dir(F.prototype.k)//logs "v"

var o = new F;
console.dir(o.k)//logs "v"

所以,关键" k"在构造函数的prototype属性上,然后将其传递给新实例化对象的 proto 属性" o"这就是为什么它可以被访问,好像它只是对象上的普通键/值对。好吧,这对我来说很有意义......但是我想到了它并且我已经看到人们将新关键字用于像String这样的内置事物(尽管通常没有这样做)

var s = new String;

上面的代码是一个新的字符串项创建方式的示例,就像基于构造函数实例化对象一样。这让我很奇怪" String只是一个构造函数????!"所以我测试了这个:

console.dir(String.prototype)

我得到了一个与s相关的完全相同属性的完整列表。那么," String"只是一个构造函数?这些项目似乎也是如此:

console.dir(String.prototype);
console.dir(Number.prototype);
console.dir(Boolean.prototype);
console.dir(Array.prototype);
console.dir(Object.prototype);
console.dir(Function.prototype);
console.dir(Date.prototype);

它们的行为似乎与构造函数完全相同。他们甚至全部资本化而不是camelcase。它们只是构造函数,并添加了一些内置的铃声和口哨声?

1 个答案:

答案 0 :(得分:3)

JavaScript中有6种数据类型:

  • 布尔
  • 字符串
  • 未定义

  • 对象

前五个是所谓的原始类型。三种基本类型(Boolean,Number和String)也具有等效的Object实现。

每当使用(Boolean | Number | String)文字时,您将创建该对应类型的值。

您还可以通过使用new运算符调用相应的构造函数来创建Boolean,Number和String 对象

var s = 'foo'; // type string
var s2 = new String('foo'); // type object

现在,您可以访问两者的属性的原因是JavaScript 自动框原始值。即当您尝试访问原始值的属性时,它会暂时将值转换为对象并访问该属性。

所以

var v = "foo";
alert(v.length);

基本上是

var v = "foo";
alert((new String(v)).length);

如果StringNumberBoolean函数在没有 new关键字的情况下调用,则会返回原始值,使它们充当转换函数。


为了解决这个问题:每个函数都有一个prototype属性,每个函数都可以充当构造函数。它是否真的取决于函数的实现。