我已经阅读了几个星期的教程,我刚刚发现当我在构造函数上使用原型(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)属性上,然后将其传输到新实例化对象“o”的 proto 属性,这就是为什么可以像访问它一样访问它只是对象上的普通键/值对。好吧,这对我来说是有道理的......但我想了一下,我看到人们使用 new 关键字来创建诸如 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);
它们的行为似乎都与构造函数完全相同。它们甚至全部大写而不是驼峰式。它们只是添加了一些内置功能的构造函数吗?
最佳答案
JavaScript中有6种数据类型:
- bool 值
- 数量
- 字符串
- 空
未定义
对象
前五个是所谓的原始类型。三种基本类型(Boolean、Number 和 String)也有等效的对象实现。
每当您使用( bool |数字|字符串)文字时,您都在创建相应类型的值。
您还可以通过使用 new
运算符调用相应的构造函数来创建 bool 、数字和字符串对象:
var s = 'foo'; // type string
var s2 = new String('foo'); // type object
现在,您可以访问这两个属性的原因是 JavaScript 自动框 原始值。 IE。当您尝试访问原始值的属性时,它会暂时将该值转换为对象并访问该属性。
所以
var v = "foo";
alert(v.length);
本质上是
var v = "foo";
alert((new String(v)).length);
<小时/>
如果调用String
、Number
或Boolean
函数而没有使用new
关键字,它们将返回一个原始值,这使得它们充当转换函数。
总结一下:每个函数都有一个prototype
属性,每个函数都可以充当构造函数。是否真的取决于函数的实现。
关于javascript - 像 String 和 Number 等对象是否被视为 "constructor functions"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24540521/