js中不是一切皆对象吗? 为什么不能给基本类型的变量添加属性和方法
可以在基本类型的 prototype 上面添加属性和方法,不过一般来说是不建议的。
基本上都是用在兼容低版本浏览器不支持的方法,如果 array 的 foreach 方法等。
在 JavaScript 中,几乎所有的东西都是对象。所有的原生类型除了 null 与 undefined 之外都被当作对象。它们可以被赋予属性(某些类型的被赋予的属性不能被持久化),并且它们都有对象的全部特征。
以上请参考MDN
//以下是个人见解
//通过直接量声明的基本类型变量, 属性与方法都是只读的
var str = '123';
var num = 123;
var arr = [1,2,3];
var bool = false;
var n = null;
str.alert = function () {
console.logt(this);
}
str.alert(); //报错, undefined is not a function, 因为属性只读, 所以并没有写入, 也就是MDN说得不能持久化
//通过基本类型的构造函数声明
var str = new String('123');
var num = new Number(123);
var arr = new Array(1,2,3);
var bool = new Boolean(false);
str.alert = function () {
console.logt(this);
}
str.alert(); //正确输出
//Object是一切的基类, 证明
Object.prototype.test = function () {
console.log('just test');
}
var t = 123;
t.test(); //输出just test
//通过构造函数拓展基本类型方法
String.prototype.console = function () {
console.log(this);
}
var s = '123';
s.console();
8 回答5k 阅读✓ 已解决
6 回答3.7k 阅读✓ 已解决
5 回答3k 阅读✓ 已解决
5 回答6.5k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
6 回答1.9k 阅读✓ 已解决
说“JS中一切皆对象”也对也不对。
说它不对,是因为实际上JS中包括两种类型的值:
基本类型:包括数值类型、字符串类型、布尔类型等
对象类型
两者是有本质区别的。
说它对,是因为在某些情况下,基本类型会表现得“很像”对象类型,使得用户可以像使用对象一样去使用基本类型数据。某些情况主要指“对属性的赋值和读取”。
以数值类型为例:
上述代码说明,基本类型可以像对象类型一样使用,包括访问其属性、对其属性赋值(尽管实际上不起作用,但是形式上可以)。
之所以能这样去使用基本类型,是因为JavaScript引擎内部在处理对某个基本类型
a
进行形如a.sth
的操作时,会在内部临时创建一个对应的包装类型(对数字类型来说就是Number
类型)的临时对象,并把对基本类型的操作代理到对这个临时对象身上,使得对基本类型的属性访问看起来像对象一样。但是在操作完成后,临时对象就扔掉了,下次再访问时,会重新建立临时对象,当然对之前的临时对象的修改都不会有效了。