所以我扩展了一些原生的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
进行交互?
答案 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"
要实际查看this
值代表的对象类型,我们可以这样做:
Object.prototype.toString.call(this);
哪会回来:
[object String]