引言:基于自己的原型链理解,及一篇文章,简书上的 //www.greatytc.com/p/9828e52b6f26 ,假如链接不能打开的话,搜索 “深入理解JavaScript的面向对象机制和原型链”,应该能搜索到该文章,最好是看完该文章,再来看我这篇写的原型链理解。
1.JS中的任何对象,都有一个非属性的原型,在原型链中相当于一个用来确定对象位置的节点,这个原型,在某些引擎中是对象的proto属性,在任何JS引擎中都可以通过Object.getPrototypeOf()得到。
下文都用proto属性来指代该原型节点。
2.当定义一个函数(其本质仍是一个对象)时,会自动生成一个该函数的prototype对象,该prototype对象一定程度上,类似于该函数的标识符(当new 出一个对象时,通过把其proto_属性,指向该对象的prototype对象来标识出自己属于该函数)。
3.对JS的任何对象,应当明确其proto的指向,对于函数对象,还要明确prototype属性的指向,这里,以代码
“function foo(){} var a= new foo();”
为例,讨论三个对象 ,分别是a foo foo.prototype指向的原型对象
3.1
a 对象是经过new运算符返回的对象,对于a来说,foo相对于构造函数,假如其函数里,没有使用this声明属性,那么其本身是不带有其他的可枚举属性的,其proto指向,foo.prototype属性指向的原型对象。
foo对象是函数对象,其有函数对象独有的prototype属性,在没有经过修改时,是指向的foo.prototype对象,而其proto则是作为函数的标识 指向内置函数Function.prototype属性指向的原型对象
foo prototype属性指向的原型对象, 其有原型对象特有的constructor属性,该属性,在没有修改的情况下,指向foo对象,另外该原型对象的proto指向标识其为对象的Object的prototype属性指向的原型对象。
3.2
3.1所述,出现了两个内置函数 Function 和 Object, Object.protytype是一切对象的源头,其proto指向null,而Function对象的prototype对象的proto指向Object的prototype属性指向的原型对象,来表明函数其实同样也是对象。
3.3
当调用a的xx方法时候,语法为a.xx,其会在原型链上寻找,即寻找a对象,假如构造函数没有用this,那么通常是没有的,接着寻找proto指向的foo原型对象,看是否有,假如再没有,则寻找Object的原型对象,最终找到null。
也是基于这一点,定义函数对象时,也是不可以为函数对象简单的声明属性的,因为一定程度上会导致new的混乱代码如下:
var foo =function(){
good:3
};
foo.sad = 3;
console.log(typeof foo.good == "undefined");
console.log(foo.sad == 3);
foo.prototype.what = 5;
var a = new foo();
console.log(typeof a.sad == "undefined");
console.log(a.what == 5);
打印出来的,都是true