持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
前言:
了解和学习前端的小伙伴肯定会听过JavaScript基础的三座大山,分别是作用域和闭包,原型和原型链,异步和单线程。本文主要是了解构造函数、实例化对象、原型对象和原型链。
构造函数
构造函数和普通函数本质上没什么区别,只不过使用了new关键字创建对象的函数,被叫做了构造函数
内置函数
ECMAScript核心语法自带内置构造函数: 有一部分内置构造函数:Function、 Object、 Array、 String、 Number、 Boolean、 RegExp、 Error、 Date
实例化对象
构造函数用new关键字创造的对象
new关键字的四个流程
(1)创建空对象
(2)this指向这个对象
(3)对象赋值
(4)返回对象
举个例子:
function Person (name, age, sex) {
//(1)创建空对象 {}
//(2)将this指向这个对象 this = {}
//(3)对象赋值
this.name = name
this.age = age
this.sex = sex
//(4)返回这个对象 return this
}
//创建三个实例化对象
let person1 = new Person('库里', 34, '男')
let person2 = new Person('詹姆斯', 38, '男')
let person3 = new Person('科比', 42, '男')
console.log(person1, person2, person3)
prototype属性和原型对象
每一个构造函数都有一个名为 prototype 的属性,译成中文是原型的意思,这个prototype 的属性指向构造函数在被创建的时候,系统都自动帮我们创建一个与之对应的对象,称之为原型对象
每个函数都有 prototype 属性 (原型对象 = 函数.prototype)
原型对象具体的作用
既然原型是一个对象 : 用于存储数据
例:
function Person() {
// 此处未定义任何方法
}
// 为构造函数的原型对象添加方法
Person.prototype.sayHi = function () {
console.log('勇士总冠军');
}
Person.prototype.sayHi()// 输出结果为 勇士总冠军
// 实例化
let p1 = new Person();
p1.sayHi(); // 输出结果为 勇士总冠军
如上:
谁可以访问 原型中的成员(属性+方法)
a. 构造函数自身 : 构造函数名.prototype
b. 这个构造函数所创建(实例化)的每一个对象
__ proto __ 属性
__ proto __ 属性属于对象,指向实例化这个对象的构造函数对应的原型,为了方便查看一个对象的原型
(实例化对象.__ proto __ === 原型对象 )
__proto__不是ECMA标准语法,有一些浏览器不支持,开发中不推荐使用
constructor属性
constructor属性属于原型对象,指向该原型的实例的构造函数,可以得知某个实例对象,到底是由哪一个构造函数生成的
(原型对象.constructor === 构造函数)
小结
画个图:
原型链
每一个对象,都有__proto__属性指向自身的原型。 而原型也是对象,也有自己的 __proto__属性指向原型的原型,以此类推形成链式结构,称之为原型链
原型对象的__proto__属性指向内置函数Object的原型对象
原型链终点 : null
如图: