Js里的对象

204 阅读2分钟

全局对象

有一些提前内置的对象供我们使用 window对象

Number()

用法1:Number('1')//1,就是将字符串1转换成数字1

用法二: var a = new Number(); 生成一个数字对象

var n = 1;
var n2 = new Number(1);
以上是什么区别呢?是内存里面的区别

为什么出现了上面两种呢,这个是js之父的老板为了让js长得像java所以,js之父就设计了这两种。但其实现在大家都是用的第一种。

再看下面的例子:

var a = 'fsdsf';
var b = new String('dsgfsgfd');

我们发现输入a[0]的时候打印出的是f,而且也可以得到a.length的值。

那么为什么我们也可以用这些属性呢?

因为当我们输入a[0]或者其他的时候,js会偷偷地创建一个临时对象,
var temp = new String(a)//这里的a值就是 'fsdsf';
然后会把临时对象 temp[0]的值返回回去,你就可以得到了。

公用属性(原型)

设立公用属性的意义就是不要浪费内存去存重复的属性

通过__proto__来指向公用属性

比如当我们新建了一个string对象
var a = new String('sdfsdd');
除了自己的属性之外
就可以看到有一个__proto__属性指向所有string的公有属性
当我们写下 a.toString()的时候,首先会看你是不是一个对象,如果不是的话,就会通过创建临时对象把你包装成一个隐藏的对象,
然后返回toString()的值,如果你是对象的话,
就去你的属性值里面找有没有toString,如果没有的话就去__proto__里面找,
然后就调用toString()

各个对象的__proto__指向关系如下,每种对象有自己的__proto__指向,最后都指向了object的公有属性。

那么这个公有属性在js里面如果没有被人引用的话就会被垃圾回收机制给回收,所以,这个公有属性是一定是被一直引用的,被谁引用呢?

那就是被Object.prototype引用

object.prototype就是object的公有属性,把公有属性换一个词就是原型

那么我们可以得出如下:

var a = {};
a.__proto__ === Object.prototype
var b = new Number();
b.__proto__ === Number.prototype(Number的公有属性)
b.__proto__.__proto__ === Object.prototype(最终指向的Object的公有属性)

总结:

在我们没有写任何代码的时候,浏览器已经给我们写好了各种prototype的指向

为什么要把 Number,Object,String,Boolean的prototype指向公有属性?因为如果不指向的话,他们就要被垃圾回收机制回收了,这样系统就崩坏了

当我们写了一个string对象之后