当谈到继承时,JavaScript 只有一种结构:对象。而每个实例对象( object )都有一个私有属性( __proto__ )指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象( __proto__ ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。
var x = 1
与var y = new Number(1)
有什么区别?
首先typeof(x)
为"number",而typeof(y)
为"object",这也就意味着x,y在内存的存储的方式上是不同的。
从上面可以发现,y内置了很多属性,可供y直接调用。
这是因为当x调用了toString属性的时候,JS中会产生一个temp(临时变量)=new Number()来获得toString的值,然后赋值于x.toString,也就是说var x = 1可以使用x.属性的形式来获得和var x = new Number一样的效果了。因此var x = 1也就完全代替了var x = new Number了。在string和boolean数据类型中也是一样的。
object两种创建方法得到的结果是一样的,只是存储的地址不同罢了。
不同的对象会有共同的属性,那么JS是解决这个问题的昵?
JS使用隐藏属性 __proto__ 来引用共用属性,从而节省了很多内存。系统使用prototype来引用这些共同属性,避免了没在使用的时候,这些共用属性没被当作垃圾而被回收。
当声明一个对象的时候,JS引擎除了在栈里面创建一个哈希之外,还有就是把__proto__指向了该有的共用属性,也就是指向了原型。
对象.__proto__ === 函数.prototype
网友评论