深入浅析JS中原型与原型链的区别

  介绍

这篇文章将为大家详细讲解有关深入浅析JS中原型与原型链的区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

正如一些面向对象语言中所实现的那样,在JavaScript中我们有时也需要创建一个拥有公共函数与属性的类作为父类来减少代码重复,实现类型检查与实现更加清晰地代码结构,在JavaScript中,继承是通过原型链实现的了。解JavaScript的继承与原型链之前首先需要了解JavaScript中对象创建的方式。

JavaScript中对象创建的方式有两种:工厂方法(工厂函数),构造器方法(构造器函数)。

<强>工厂方法

工厂方法在编程领域是一个非类或构造器的返回对象的方法,在JavaScript中,任何返回不使用新关键词创建对象的方法都是工厂方法。

功能人(firstName、lastName、年龄){
  这一点。firstName=firstName;
  这一点。lastName=姓;
  这一点。年龄=年龄;
  }

<>强新的行为

当同时在工厂方法和构造器方法上使用新关键词创建时,工厂方法创建出的对象的__proto__属性指向Object.prototype,构造器方法创建出的对象的__proto__属性指向本身的Xxx。原型。

 const迈克=新人(& # 39;迈克# 39;& # 39;大# 39;,23);
  
  迈克。__proto__//对象。原型
功能人(firstName、lastName、年龄){//这个={};//这个。__proto__=Person.prototype;
  这一点。firstName=firstName;
  这一点。lastName=姓;
  这一点。年龄=年龄;//返回;
  }

在构造器方法上没有返回值所以后台创建的这将被返回,而工厂方法内由于返回了对象所以后台不再添加返回这个自然返回的内容将不一致。

如果没有在构造器方法前使用新关键词,而将构造器方法直接调用执行,其仅作为一个方法来被执行而非构造器。

 const鲍勃=人(& # 39;鲍勃# 39;& # 39;大# 39;,23);
  鲍勃//定义。因为这里的人当作方法直接调用了且没有返回值
  窗口。firstname//鲍勃。函数内的这将指向全局作用域,导致意外操作

<强>

<强>原型

原型(原型)可以认为是一个JavaScript方法的属性,每次在JavaScript代码中创建方法时,JavaScript引擎会将一个名为原型的属性添加上去,这个原型属性是一个对象(原型对象),这个对象默认有一个构造函数属性指向原方法对象。任何添加到原型的属性和方法都在这个对象里面,所有该类实例共享这个原型对象,实例对象的__proto__属性指向这个对象,方法的原型属性指向这个对象。

在ECMAScript的标准对象里。[[原型]]是访问原型的方法,但在2015年ECMAScript中用Object.getPrototypeOf()和Object.setPrototypeOf()来替代。等价的__proto__是多数浏览器使用的事实上的但是非标准的实现。

深入浅析JS中原型与原型链的区别