「js基础02」-原型和原型链

215 阅读3分钟
目录
引言
构造函数
函数对象
原型
原型链
整体总结一下

引言

  • 首先所有存在的事物,都可称之为对象。
  • 函数也是一样的道理,也可以看做是一个对象。

构造函数

简单来说,构造函数就是专门用来生成实例对象的函数,用来描述实例对象里面的属性

// 基本的构造函数
function Person(name, age, job) {
  this.name = name;
  this.age = age;
  this.job = job;
}
//person1 是Person 的实例
var person1 = new Person("peng", 28, "前端");   

注意:

  • 1、构造函数名字的第一个字母通常大写。
  • 2、函数体内部使用了this关键字,代表所要生成的对象实例。
  • 3、生成对象的时候,必须使用new命令。
  • 4、new命令就是执行构造函数,返回一个实例对象

函数对象

  • JS所有对象分为函数对象和普通对象。
  • 其中最直观的一种判断,凡是new Function()创建的,都可以称之为函数对象。
  • 既然对象的存在,一定有对应的属性,函数对象一般有两个隐藏的属性
    // prototype // 原型对象,(显式原型)
    // __proto__ // 隐藏式原型
    

原型

  • 在js中我们使用构造函数新建一个对象的时候,每个构造函数的内部都有一个prototype属性值,这个属性值是一个对象,包含了可以有该构造函数的所有实例共享的属性和方法。
  • 当我们使用构造函数创建一个对象后,这个对象的内部将包含一个指针,这个指针指向构造函数prototype属性对应的值,就叫做对象的原型

prototype

function PersonA() {}
console.log(typeof PersonA.prototype);
// object
console.log(typeof Object.prototype); 
// object
  • 从上面例子可以看出,prototype是一个普通对象,是函数对象的构造函数创建的一个实例。

  • 相当于在PersonA创建的时候,自动创建了一个它的实例,并且把这个实例赋值给了prototype。

// 如果直接打印
console.log(PersonA.prototype);
//结果如下,实际上只有两个属性
//constructor
//__proto__

// 原型对象添加方法
function PersonA() {
  
}
PersonA.prototype.sayName=function () {
  console.log(this.name)
}

constructor

  • 构造器constructor就是用来构造函数对象的
  • constructor 属性返回对创建此对象的函数对象的引用

proto

  • 所有的对象obj(除了null、undefined以外)都有__proto__属性(隐式原型)
  • proto 属性本质上是一个指针,指向函数对象的prototype属性

关系可以如下图所示

原型链

  • 原型链是JS中实现继承的主要方法。
  • 简单来说就是让一个引用类型继承另一个引用类型的属性和方法

整体总结一下

// 例子如下
function Person(name, age, job) {
  this.name = name;
  this.age = age;
  this.job = job;
}
var person1 = new Person("peng", 28, "前端");
//person1 是Person 的实例   




// 1、Person是一个构造函数
// 2、person1是Person的一个实例
// 3、__proto__是原型,每个对象都存在原型
// 4、prototype是函数才有的属性
// 5、person1具备constructor属性,是因为他是Person的实例,是new出来的对象,person1 的 constructor


// person1.constructor==Person
// person1.__proto__==Person.prototype
// Person.prototype.constructor==Person

参考文献