js中原型链

一直不太明白JS中prototype和_proto_的区别,对原型链的继承也很模糊,就把自己网上看的书中提到的能便于自己理解都总结在一起方便以后自己学习。

首先,javascript没有class的概念,继承的方式是通过一种“原型链”来完成的,我们创建的每个函数都有prototype属性(也可以说是一个对象),可以用来做内存块共享,在各个实例中共享数据。

其次,prototype和__proto__都指向原型对象,任意一个函数(包括构造函数)都有一个prototype属性,指向该函数的原型对象,同样,任意一个构造函数实例化的对象,都有一个__proto__属性,指向构造函数的原型对象。(__proto__并非标准属性,ECMA-262第5版将该属性或指针称为[[Prototype]],可通过标准方法Object.getPrototypeOf()访问该属性)

即:

1.任何函数由function关键字定义的都可以用new关键字实例一个对象,都有prototype属性,都有construtor构造函数,构造器属性,他们的proto链指向function对象。

2.单例对象,如Math,JSON都是以对象形式存在的,无法new,没有prototype属性,没有construtor构造函数,构造器属性。

3.prototype属性指向对象本身,constructor 属性返回对创建此对象的函数对象的引用。

或者看图

网上截的图


理解:

(1)JavaScript中的函数是对象,而且除了使用字面量定义外,都需要通过函数来创建对象;

(2)prototype是构造函数访问原型对象,__proto__是对象实例访问原型对象,这就是为什么说原型链的形成是靠__proto__ 而非prototype。

社区找的图



最后,附带两个方法:

1.object.hasOwnProperty('proName');括号内必须要加引号,并且直接写入属性名

如果该属性或者方法是该对象自身定义的而不是器原型链中定义的 则返回true;否则返回false

2.object1.isPrototypeOf(object2); 

object1是一个对象的实例; object2是另一个将要检查其原型链的对象

isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false。

即:如果 object2 的原型链中包含object1,那么 isPrototypeOf 方法返回 true;如果 object2 不是一个对象或者 object1 没有出现在 object2 中的原型链中,isPrototypeOf 方法将返回 false。(原型链可以用来在同一个对象类型的不同实例之间共享功能)

你可能感兴趣的:(js中原型链)