Number / String Prototype中的`this`是什么?

时间:2014-05-02 21:15:37

标签: javascript prototype this

所以我扩展了一些原生的JS对象,并注意到this时的一些奇怪之处。当我在字符串上记录this时,我注意到它是一个类似于数组的对象,它还有一个名为[[PrimitiveValue]]的属性,其中包含值I期望的值,但不能是使用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对象的原型中有效地与this进行交互?

2 个答案:

答案 0 :(得分:2)

那些只是本土物体;你使用this就像在普通的原型函数中一样。

请注意,您确实在使用对象:使用“String”或“Number”构建的实例或其他一些本机构造函数。 "hello world"12.54之类的东西不是对象,它们是原始的。他们没有原型。

当您将原始对象用作对象时,运行时会自动将其提升为对象实例。当您使用.[]运算符的原始值时会发生这种情况。

从这些对象(String,Number或Boolean的实例)中,可以使用this.valueOf()获取原始值。

答案 1 :(得分:2)

在String原型中,this引用String对象类型。它有length属性,但它不是一个真正的数组,它是一个类似数组的对象。您可以在this之类的下标中访问this[0]值,但要将其转换为数组,以便您可以使用forEach等方法以及Array的所有其他原型方法,你可以做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"

enter image description here

要实际查看this值代表的对象类型,我们可以这样做:

Object.prototype.toString.call(this);

哪会回来:

[object String]