Javascript 什么是“this”内部数字/字符串原型?

Javascript 什么是“this”内部数字/字符串原型?,javascript,prototype,this,Javascript,Prototype,This,因此,我扩展了一些原生JS对象,并注意到了一些关于的奇怪之处。当我在字符串上记录this时,我注意到它是一个类似数组的对象,它还有一个名为[[PrimitiveValue]]的属性,其中包含我期望的值,但无法使用obj['[PrimitiveValue]]]语法检索 举个例子: String.prototype.method = function() { return this; }; Number.prototype.method = function() { return this

因此,我扩展了一些原生JS对象,并注意到了一些关于
的奇怪之处。当我在字符串上记录
this
时,我注意到它是一个类似数组的对象,它还有一个名为
[[PrimitiveValue]]
的属性,其中包含我期望的值,但无法使用
obj['[PrimitiveValue]]]
语法检索

举个例子:

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

Number.prototype.method = function() {
  return this;
};

var str = "12";
var num = 12;

console.log( str.method() );
console.log( num.method() );
为了获得实际值,我尝试了类似的方法,但它被记录为未定义:

String.prototype.method = function() {
  return this['[[PrimitiveValue]]'];
};

Number.prototype.method = function() {
  return this['[[PrimitiveValue]]'];
};
我注意到可以使用一些类型转换来获取原始值,但是这感觉非常粗糙。(
this+0
表示数字,
this+'
表示字符串。)


那么我在这里处理的是什么类型的对象呢?如何在原生JS对象的原型中有效地与
这个
交互?

这些只是原生对象;您使用
这个
就像在正常的原型函数中一样

请注意,您确实在使用对象:使用“字符串”或“数字”或其他本机构造函数构建的实例。像
“hello world”
12.54
这样的东西不是对象,而是原语。他们没有原型

当您将基本体对象当作对象使用时,运行时会自动将其升级为对象实例。当您将原语值与
[]
运算符一起使用时,会发生这种情况


从这些对象(字符串、数字或布尔值的实例)中,可以使用
this.valueOf()

获取基本值。在字符串原型中,
this
表示字符串对象类型。它具有长度属性,但它不是一个真正的数组,它是一个类似数组的对象。您可以在下标处访问
this
值,如
this[0]
等等,但要将其转换为数组,以便使用数组的方法和所有其他原型方法,您可以执行
var args=array.prototype.call(this)例如,让我们举例说明:

String.prototype.hello = function() {
  console.log(this);
  console.log(typeof this);
  console.log(Object.getOwnPropertyNames(this));    
}
"adfadfda".hello();
要获得hello方法调用的完整字符串,可以使用
this.toString()
在这种情况下返回的值
“adfadfda”

要实际查看
值表示的对象类型,我们可以执行以下操作:

Object.prototype.toString.call(this);
这将返回:

[object String]

在字符串原型上定义的函数中,当通过字符串实例调用时,
引用字符串实例。字符串实例不是字符数组;它们是字符串实例(对象)。字符串实例的基本字符串值可以通过
.toString()
函数获得。我可以判断它不是实际数组(
array.isArray
返回false)。我更感兴趣的是如何正确地与
这个
对象交互@Pointy提到了
.valueOf()
,这可能正是我需要的东西。@drop.on.Caprica yes
.valueOf()
为您提供了实例化对象实例所依据的基本值。如果您知道关于本机原型如何工作的任何资源,我非常有兴趣了解更多。@drop.on.Caprica它们的工作原理与其他原型一样。当本机值(字符串或数值常量等非对象)自动装箱到对象实例中时,这种魔力就来了。因此,
“hello world”。length
在幕后隐式创建了一个字符串实例。有趣的是,从来都不知道
.valueOf()
。你知道我可以去哪些地方阅读详细信息吗?@drop.on.Caprica check.Fwiw,我可能错了,但我认为在严格模式下,
这个
甚至会引用原语值。@FelixKling确认在
使用严格
模式时
这个
引用JS原语的值。这很有道理;我甚至没有想到:)那些标准的家伙总是想着我们这些小人物