原型链和作用域链的用途
原型链是用于查找属性的
作用域链是用于查找变量的
在函数内部使用一个变量时,如果这个变量在本作用域内找不到,就会到上一级的作用域中查找,
函数当前作用域的上级作用域为该函数被创建(或者说被定义)时所在的作用域,而不是函数被调用时所在的作用域
当调用一个对象的属性时,如果这个属性不是对象本身的属性,那就会依次沿着原型链向上查找,直到找到为止,若找到最上层也找不到,则返回undefined
对象所继承原型对象就是创建这个对象的函数的原型
例如自定义了函数test,那么在定义test函数时,就会默认使用Objec生成一个对象赋值给test函数的prototype属性,来作为test函数的原型
那么当使用new test()创建对象时,创建的对象就会继承test函数的原型,也就是test.prototype。因为是默认生成的空对象,并没有什么属性和方法被继承。
我们可以自定义test.prototype来实现想要继承的属性和方法
如test.prototype={a:1, b:2, m:function(){} }
一些内置对象如Array, Date,Number等其实就是函数,内部分别为这些函数定义的原型对象,具有某些属性和方法。
因此生成的数组对象和日期对象都会继承这些函数的原型对象而具有特定的属性和方法