js原型链的深入理解


基本原则:

1、所有的对象都有__proto__属性,该属性对应该对象的原型。
2、所有的函数对象都有prototype属性,该属性的值会被赋值给该函数创建的对象的__proto__属性。
3、普通对象没有prototype属性,普通对象都有constructor属性
4、所有的原型对象都有constructor属性,该属性对应创建所有指向该原型的实例的构造函数。
5、函数对象和原型对象通过prototype和constructor属性进行相互关联。

6、原型链通过__proto__属性完成,继承属性通过__proto__属性递归向上查找。


个人理解:

1、原型对象:就是构造器自己生成的一个自己的实例,原型对象就是普通对象(除Function);

2、构造器(函数对象)的prototype属性指向的都是构造器自带的实例

3、原型对象constructor指向构造器

4、普通对象的__proto__属性指向构造它的那个构造器自带的实例,也就是原型对象;


!!!注意:

1、构造器都自己带个实例!

2、Object.prototype.__proto__ === null 是原型链的终点!

3、构造器是函数,所以由Function生成,构造器的__proto__也指向生成他的构造函数的自带实例,就Function.prototype 

4、Function.prototype就是Function自己,所以是函数对象。

5、Object.__proto__指向Function.prototype。


使用构造器的图(使用{}或者new Object()创建的对象,原型链直接指向Object.prototype):

js原型链的深入理解_第1张图片


原型链可以改变,一般用于继承,已经存在属性不覆盖,不存在属性在原型链中能够找到。

示例代码1:

var will1 = new Person();
var will2 = new Person("Will2", 28);


will2.check = "qiuqiu20";               //原型链继承过程: 已经有的属性不重新赋值,没有的属性赋值;
will1.__proto__ = will2;


console.log(will1);  			//will1.name === undefined  will1.age === undefined
console.log(will1.__proto__.hasOwnProperty("check"));    //true
console.log(will1.hasOwnProperty("check"));              //false


示例代码2:

var will1 = new Object();
var will2 = new Person("Will2", 28);

will2.check = "qiuqiu20";               //原型链继承过程: 已经有的属性不重新赋值,没有的属性赋值;
will1.__proto__ = will2;

console.log(will1);  			//will1.name === "Will2"  will1.age === 28
console.log(will1.__proto__.hasOwnProperty("check"));    //true
console.log(will1.hasOwnProperty("check"));              //false











参考文档:http://www.jb51.net/article/80109.htm

你可能感兴趣的:(js,es5)