原型、原型链和new

63 阅读2分钟

原型 && 原型链

原型关系:

  • prototype 是构造函数的属性,用来定义实例共享的属性和方法。它是一个静态的属性,属于构造函数本身,不属于任何实例。
  • prototype 属性允许你定义所有实例共享的行为。通过将方法放在 prototype 上,你可以减少内存使用,因为所有实例共享同一个方法。
  • __proto__ 是实例对象的属性,它指向构造函数的 prototype,从而实现实例对象与原型对象之间的联系。
  • __proto__ 属性让实例对象能够沿着原型链查找属性和方法,实现对象之间的继承。通过 __proto__,每个对象都可以继承其原型对象的属性和方法,从而实现代码复用和继承。
  • prototype 是用来定义构造函数的共享行为的地方,属于构造函数。__proto__ 是用来实现继承的属性,属于实例对象。两者的结合使得 JavaScript 可以通过原型链机制来实现对象之间的继承,同时保持内存效率和代码复用。

原型:   在 JS 中,每当定义一个对象(函数也是对象)时,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype  属性,这个属性指向函数的原型对象

console.log(obj.__proto__ === Object.prototype); // true

原型链: 是对象通过其原型连接到一个链条,最终指向 Object.prototype

  1. 每个函数在创建时都会自动获得一个 prototype 属性,这个属性是一个对象,默认情况下它包含一个唯一的属性 constructorconstructor 指向该函数本身。
  2. 每个对象都有一个内部属性 __proto__,它指向创建这个对象的构造函数的 prototype 对象。这个 __proto__ 属性形成了对象的原型链。
  3. 原型链的终点是 Object.prototype,它的 __proto__ 属性为 null,表示不再有更高的原型。这是所有 JavaScript 对象的基础。
  4. 由于所有对象最终都继承自 Object.prototype,因此所有对象都继承了 Object 的基本方法,比如 toString()hasOwnProperty() 等。

特点:  JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。

new 运算符的实现机制

  1. 首先创建了一个新的空对象
  2. 设置原型,将对象的原型设置为函数的prototype对象。
  3. 让函数的this指向这个对象,执行构造函数的代码(为这个新对象添加属性)
  4. 判断函数的返回值类型,如果是值类型,返回创建的对象。如果是引用类型,就返回这个引用类型的对象。