继承方法到除原语以外的所有对象
Inherit Method to All Objects Except Primitives
我想添加一个能够在所有对象上工作的方法。最好它不存在于基本类型(数字、布尔值、字符串、符号)上,否则它无法工作。
这是可能的吗?如果是,怎么做?
使用对象。prototype不能工作,因为基本类型继承自Object.
您可以在Object
的原型上设置函数,然后在不需要它的构造函数的原型上设置相应的成员undefined
:
Object.prototype.foo = function() { alert("foo"); };
Number.prototype.foo = undefined;
var x = {};
var y = 10;
x.foo(); // works
y.foo(); // TypeError: y.foo is not a function
我不知道你为什么这样做,这看起来像一个代码气味,但你可以。
原语不是对象,不能从任何地方继承。它们可以封装在从Object.prototype
继承的对象中,但这些都是对象。
它可能看起来像原语继承属性,但在底层,这些是在对象包装器上访问的,而不是原语。当GetValue解析属性引用时,
- 如果HasPrimitiveBase(V)为true,则
- Assert:在这种情况下,base将永远不会为空或未定义。
- 让基础ToObject ()。
- 返回基地。[[有]](GetReferencedName (V ), GetThisValue (V ))。
因此,如果引用的基类是原始类型,则在尝试获取该属性之前将其转换为对象。
但是正如@nnnnnn所指出的,当您调用该方法时,this
值将是原语,因为引用的基没有改变。注意,在草率模式下,它将被强制为一个对象。
实际上,如果您想要在调用方法时防止原语被用作引用的基础,您可以利用这一点并测试this
值是否为对象:
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"
从原语中删除方法的简化方法。
Object.prototype.test = function() { }
for(let { prototype } of [ String, Number, Boolean, Symbol ]) {
prototype.test = undefined
}
相关文章:
- 从 javascript 中的对象方法返回一个对象
- 在Javascript中调用对象方法时不是函数类型错误
- Java Script将对象方法映射到数组中的对象
- 将数据从promise then方法传递到对象方法
- 设置显示后Flash对象方法不可用:无
- 通过引用Javascript中的另一个函数来传递对象方法
- Javascript库对象方法声明
- JavaScript对象范围-在对象方法中使用对象变量
- jQuery:如何使用文字对象方法中的方法来获取全局变量
- Javascript 对象方法不更新变量
- setInterval 只在对象方法上运行一次
- 对象方法中函数中的上下文
- 用JavaScript编写对象方法的最佳方式是什么
- 使用回调处理程序调用函数内部的父对象方法
- 从Javascript中的对象方法中访问全局变量
- 将此(对象)传递到一个对象方法嵌套方法中
- 为什么我得到“;不是函数错误”;对于我的对象方法
- 带有回调的Javascript对象方法中的递归
- 更正Node.js异步管道中的对象方法调用
- 如何在对象方法上调用requestAnimFrame