原型、原型对象、原型链

1、什么是原型(隐式原型、显式原型)

JavaScript 的所有对象中都有一个私有属性,我们一般称之为隐式原型(__proto__),它指向的是构建出这个实例的类的显式原型(prototype),也就是构造函数的 prototype。

2、什么是原型对象?作用?

定义: 

在构造函数创建出来的时候,系统会默认创建一个(普通)对象与这个构造函数相关联,这个对象就是这个构造函数的原型对象(prototype)。

作用:

为构造函数的实例,共享属性和方法。所有实例中引用的原型都是同一个对象;

使用 prototype 就可以把公共的属性或者方法挂在原型对象上,这样可以避免在每个对象上都复制一份相同的属性和方法,从而节省内存。

 3、什么是原型链?作用?

原型链是 JavaScript 中实现继承的一种机制。

总结: 

原型链本质就是一个链表。

当我们 new 一个函数的时候,它会返回一个实例。这个实例会有一个 __proto__ 属性指向它构造函数的原型,同时呢这个function 会有一个 prototype 属性指向这个原型。而当我们访问实例上的属性的时候,如果它本身没有,就会顺着 __proto__ 指向的原型上查找,如果再找不到呢,就往原型的原型上查找,一直找到到大Objct,这样一来就形成一种链式的结构称为原型链。

原型链是 js 特有的,所有对象都可以共享原型链的属性和方法,这个在其他语言都没有(JAVA/Python),它的优势就是能够节省内存,而且非常方便。

使用 prototype 就可以把公共的属性或者方法挂在原型对象上,这样可以避免在每个对象上都复制一份相同的属性和方法,从而节省内存。

那应用场景呢,比如在 Vue 源码中就有原型链。像我们平常开发用的 $axios / $nextTick / $emit 就是放在了 Vue 的原型上。

缺点呢,就是在原型链上查找属性会比较耗时,对性能有副作用。另外,如果试图访问不存在的属性的时候,会遍历整个原型链,也是很消耗性能的。

分析:

在 JavaScript 中,每个对象都有一个私有属性,它指向的是构建出这个对象的构造函数的原型对象。而这个原型对象呢,它也是由构造函数创建出来的,它也有指向的原型对象,层层向上,就形成一种链式的结构称为原型链。它的优点呢,是实现了继承、属性的共享和方法的复用。 

当我们访问一个对象的属性或者方法的时候,如果本身没有这个属性或方法,那么就会沿着它的原型链层层向上查找,直至找到匹配的属性或者方法,或者到达原型链的末尾。

当我们创建一个对象时,可以通过指定它的原型来继承原型上的属性和方法。在查找属性或方法时,如果对象本身没有这个属性或方法,就可以在其原型上查找。这样可以避免在每个对象上都复制一份相同的属性和方法,从而节省内存。

原型链的作用在于实现了 JavaScript 中的继承。当一个对象需要继承另一个对象的属性和方法时,可以设置子构造函数的原型对象是父构造函数的实例,从而使子对象能够沿着原型链访问父对象的属性和方法。

缺点呢,就是在原型链上查找属性会比较耗时,对性能有副作用,这在性能要求苛刻(一般情况基本无影响)的情况下很重要。另外,如果试图访问不存在的属性的时候,会遍历整个原型链,也是很消耗性能的

你可能感兴趣的:(每日专栏,JavaScript,原型模式)