我想添加一个能够处理所有对象的方法。优选地,它不应该存在于原语(数字,布尔,字符串,符号)上,它不能在其上工作。
这是可能的,如果是的话,怎么样?
使用Object.prototype不起作用,因为原始类型继承自Object。
答案 0 :(得分:3)
您可以在TextInputLayout
的原型上设置函数,然后在构造函数的原型上设置相应的成员,您不希望它Object
:
undefined
我不知道你为什么要这样做,这似乎是一种代码味道,但你去了。
答案 1 :(得分:1)
基元不是对象,不会从任何地方继承。它们可以包装在继承自Object.prototype
的对象中,但这些是对象。
它可能看起来像是基元继承属性,但在引擎盖下,这些是在对象包装器上访问的,而不是基元。当GetValue解析属性引用时,
- 如果HasPrimitiveBase( V )为真,那么
- 返回 base 。[[Get]](GetReferencedName( V ),GetThisValue( V ) )。
因此,如果引用的基础是基元,则在尝试获取属性之前,它将被转换为对象。
但正如@nnnnnn所说,当你call the method时,this
值将是原语,因为引用的基数没有改变。请注意,在草率模式下,它将被强制转换为对象。
事实上,你可以利用这个并测试this
值is an object,如果你想要的是在调用方法时阻止原语被用作引用的基础:
Object.prototype.method = function() {
"use strict";
if(Object(this) !== this) {
throw Error('This method can only be called on objects');
}
// ...
return "works";
};
true.method(); // Error: This method can only be called on objects
new Boolean(true).method(); // "works"
答案 2 :(得分:0)
从基元中删除方法的简化方法。
Object.prototype.test = function() { }
for(let { prototype } of [ String, Number, Boolean, Symbol ]) {
prototype.test = undefined
}