Skip to content
大纲

原型和原型链

定义

js 不管什么类型对象都有它的原型,用来共享属性和方法,实现继承。可以使用原型__proto__访问,指向其构造函数的原型对象 prototype,里面包含 constructor 和 prototypr 自定义的原型属性和方法。因为原型对象他本身也是一个对象,所以他也有原型,往前推直到 null,这样就形成了一个链条,称为原型链。它是 js 中继承属性和方法的主要方式。当我们试图访问一个对象的某个属性时,如果该对象自身没有这个属性,JavaScript 会沿着原型链向上查找。

注意点

  1. 对象的__proto__指向构造函数的 prototype
  2. 不是所有函数都是构造函数,只有使用 new 关键字创建了实例对象,那 new 的这个函数就是这个实例对象的构造函数
  3. __proto__是隐式的直接打印式看不到的
  4. [[prototype]]__proto__指向式一样的,但他无法访问
  5. 只有函数才有原型对象 prototype

构造函数

使用 new 关键字创建了实例对象,那 new 的这个函数就是这个实例对象的构造函数,在实例对象的隐式原型__proto__的 constructor 中可以找到。

构造函数创建实例过程

  1. 创建一个新对象
  2. 将构造函数的作用域赋值给新对象(这样 this 就指向了新对象)
  3. 执行构造函数中的代码(为新对象添加实例属性和实例方法)
  4. 返回新对象

原型对象 prototype(显式原型)

只有函数才有原型对象 prototype,如果有以这个函数作为构造函数的实例对象,那这个实例可以直接使用原型对象 prototype 上的方法或属性

实现

js
function myNew() {
  const obj = {};
  const [constructor, ...args] = arguments;

  obj.__proto__ = constructor.prototype;

  let res = constructor.apply(obj, args);

  return typeof res === "object" ? res : obj;
}

function People(name, age) {
  this.name = name;
  this.age = age;
}

let peo = myNew(People, "Bob", 22);
console.log(peo.name);
console.log(peo.age);

Released under the MIT License.