原型

115 阅读2分钟

概述

原型的单词是 prototype, 原型的这个名字是行业内共同认可的名字

只要是函数就会有原型,构造函数有一个默认的关联对象,就是构造函数的原型

所有构造函数的实例,共享一个原型

原型上一般是挂载函数

操作

原型是一个对象,所以拥有动态特征,意味着可以在原型动态添加任意的成员

作用

在原型中添加的成员,后期这个构造函数所创建的对象可以调用

// 规范:构造函数一般是以大写字符开头
function Student(name, age) {
  this.name = name
  this.age = age
}
// 先添加再使用
Student.prototype.say = function() {
  console.log('say')
}
​
// 一个对象所能访问的原型,是创建这个对象时构造函数所指向的原型
let stu = new Student('jack', 20)
console.log(stu)
stu.say()
stu.code()
Student.prototype = {
  code: function() {
    console.log('code')
  },
  debug: function() {
    console.log('debug')
  }
}
let stu1 = new Student('jack', 20)
stu1.code()

image.png 注:如果是点语法添加原型的成员,那么要求先添加再创建,再使用

如果是重置对象,一定要先重置,再创建对象

构造函数原型对象的三角关系

构造函数:构造函数就是一个函数,配合new可以新建对象。

实例:通过构造函数实例化出来的对象我们把它叫做构造函数的实例。一个构造函数可以有很多实例。

原型:每一个构造函数都有一个属性prototype,函数的prototype属性值就是原型。通过构造函数创建出来的实例能够直接使用原型上的属性和方法。

image.png

属性查找原则

如果是获取操作

  1. 会先在自身上查找,如果没有
  2. 则根据__proto__对应的原型去找,如果没有
  3. 一直找到Object.prototype,如果没有,那就找不到从而报错

原型链

任何一个对象,都有原型对象,原型对象本身又是一个对象,所以原型对象也有自己的原型对象,这样一环扣一环就形成了一个链式结构,我们把这个链式结构称为:原型链。

原型链继承

// 父级
function Person(name, age) {
  this.name = name
  this.age = age
}
Person.prototype.say = function() {
  console.log('say')
}
Person.prototype.code = function() {
  console.log('code')
}
let per = new Person()
per.say()
// -----------------------------------------------
// 子级
function Student(name, age) {
  this.name = name
  this.age = age
}
Student.prototype.debug = function() {}
// 原型继承
// Student.prototype.say = Person.prototype.say
// Student.prototype.code = Person.prototype.code
// 重置原型的缺点
// 1.会将自身的原型中的成员抛弃
// 2.造成原型的构造函数的指向错误
Student.prototype = Person.prototype
Student.prototype.constructor = Student
      
let stu = new Student('jack', 20)
stu.say()
stu.code()
console.log(stu.__proto__.constructor)
console.log(per.__proto__.constructor)