为什么"这个"在String.prototype中返回一个对象?

时间:2016-07-05 14:52:06

标签: javascript

这可能是重复的,愚蠢的或偏离主题的,但实际的问题是问题的标题。

我想做一些简单的事情:

String.prototype.log = function() {
  console.log(this);
  return this;
}

当被调用时(例如在Firebug中),结果是:

String { 0="t",  1="e",  2="s",  more...}

对于:"test".log(),当然也会返回相同的内容。

现在,解决方法是在任何一方进行""连接或this.toString()

为什么thisString.prototype范围内的对象而instanceof同时属于ObjectString

4 个答案:

答案 0 :(得分:2)

创建字符串时,实际上是创建字符串函数的实例(对象)。

在Chrome控制台中输入String

console.log(String);
Output : function String()

如果您创建一个字符串

var x = new String("aaa");

x实际上是String函数

的一个实例
console.log(x instanceof String); // true

为什么x是Object的实例?

在JavaScript中,每个对象都有一个__proto__链接。

x.__proto__ == String.prototype;

这意味着x的原始链接指向String原型。

现在String.prototype也有__proto__

String.prototype.__proto__ == Object.prototype;

instanceof运营商首先搜索__proto__链接并跟踪它。

x的原型链接指向String的原型,String的原型指向Object原型。< / p>

因此x也是Object的一个实例。

答案 1 :(得分:1)

不确定但找到了可能回答问题的内容:

String(Value)

  

使用参数值调用 SELECT flight_id, depart, arr, price FROM user.flightdb t2 LEFT JOIN user.booking t1 ON t1.flightID = t2.flight_id and t2.source = 1 and t2.dest = 4 AND t1.date = "02/02/2016" WHERE t1.flightID IS NULL; 时,将执行以下步骤:

     

如果没有参数传递给这个函数调用,那么让s为“”。

     

否则,

     

如果NewTarget未定义且Type(value)为Symbol,则返回SymbolDescriptiveString(value)。

     

我们是ToString(值)。

     

ReturnIfAbrupt(一个或多个)。

     

如果未定义NewTarget,则返回s。

     

返回StringCreate(s,GetPrototypeFromConstructor(NewTarget,“%StringPrototype%”))。

     

String函数的length属性为1.

现在StringCreate会返回String exotic object

根据它,

  

String对象是一个奇特的对象,它封装了一个String值,并公开了与String值的各个代码单元元素对应的虚拟整数索引数据属性。

     

Exotic String对象始终具有名为“length”的数据属性,其值是封装的String值中的代码单元元素的数量。代码单元数据属性和“长度”属性都是不可写和不可配置的。

答案 2 :(得分:0)

我可以找到的与此问题直接相关的最佳答案在JavaScript所基于的ECMAScript规范中得到了解答。

这里是String的规范...... http://www.ecma-international.org/ecma-262/5.1/#sec-8.4

摘录:

  

String类型是0或0的所有有序有序序列的集合   更多16位无符号整数值(“元素”)。 String类型是   通常用于表示正在运行的ECMAScript中的文本数据   程序,在这种情况下,String中的每个元素都被视为代码   单位价值(见第6条)。每个元素都被视为占用一个   序列中的位置。这些职位编入索引   非负整数。第一个元素(如果有的话)位于0位置   位置1处的下一个元素(如果有),依此类推。字符串的长度   是其中的元素数(即16位值)。空的   字符串的长度为零,因此不包含任何元素。

特别是这部分:

  

每个元素被视为占据序列中的位置。   这些位置用非负整数索引。

这解释了为什么显示的字符串的实际更真实的存储本质上是数组的。按照规范中的要求,字符按顺序进行索引。

答案 3 :(得分:0)

在调用String函数之前,原始字符串“test”为boxedlog类型的对象中。