你必须要学会的js构造函数、原型、原型链

简介: 你必须要学会的js构造函数、原型、原型链

js构造函数、原型、原型链


前言


在js学习过程中,总有几个稍微难一点的东西使大家摸不着头脑,其中原型、原型链就是一点,但是在学习原型的前提下必须要搞懂构造函数这个知识,这些东西是联系在一起的!


构造函数


定义


new 关键字来调用的函数,称为构造函数。构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋予初始值,构造函数首字母一般大写


为什么要使用


在做项目过程中,你可能想要添加多条数据,如果我们一条条的去添加未免有点麻烦,例如:


let one = {name:'james',age:37,positions:'SF'}
        let two = {name:'davis',age:29,positions:'PF'}
        let three = {name:'curry',age:33,positions:'SG'}
        let four = {name:'George',age:31,positions:'PG'}
        let five = {name:'Jokic',age:27,positions:'C'}
        .....


我在这里要录入nba球员的数据,我如果采取这种形式,我只能一条条的去写,其中,name、age、positions属性我要一直去填写,我一想,nba里面有几百名球员,我要是一直这样录,我不得累死?这时,构造函数的便利便显示出来了!


我们可以将name、age、positions作为构造函数的参数,代码示例如下:


function Player(name,age,positions) {
            this.name = name,
            this.age = age,
            this.positions = positions,
            this.play = function() {
                console.log('我打球很厉害!');
            }
        }


当我们创建构造函数后,我们便可以通过new关键字去调用了:


let a = new Player('james',37,'SF')
        let b = new Player('davis',29,'PF')
        let c = new Player('curry',33,'SG')
        ...


我们能够发现这一种方式非常的方便,能够大幅度减少我们写重复代码,这就是构造函数的代码复用


执行顺序(new执行)


  1. 在内存中创建一个新的空对象
  2. 让this指向这个空对象
  3. 执行构造函数里面的代码,给这个新对象添加属性和方法
  4. 返回这个新对象(注:所以构造函数里面不用写return)


原型对象(prototype)


构造函数虽然好用,但是也存在一个问题,那就是浪费内存

在使用构造函数创建对象时,如果对象里面有方法(复杂数据类型),需要单独开辟内存空间

那么我们创建多个对象时,不仅要为这些对象创建内存空间,还要为每个对象创建单独的内存空间,这就造成了内存浪费,所以,我们引进了原型!


构造函数通过原型分配的函数是所有对象所共享的


Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象,注意:这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有.

我们可以将哪些不变的方法,直接定义在prototype对象上,这样,所有对象的实例就可以共享这些方法.


function Player(name,age,positions) {
            this.name = name,
            this.age = age,
            this.positions = positions
            // this.play = function() {
            //     console.log('我打球很厉害!');
            // }
        }
        Player.prototype.play = function() {
            console.log('我打球很厉害!');
        }
        let a = new Player('james',37,'SF')
        let b = new Player('davis',29,'PF')
        let c = new Player('curry',33,'SG')
        a.play()  //我打球很厉害!
        b.play()  //我打球很厉害!


由此,一般情况下公共的属性定义到构造函数中,公共的方法定义到原型对象中,原型可以解决内存浪费的问题,不用每次再单独开发一个内存空间,只用开发一个即可,将所有对象指向原型对象就可以了!


对象原型(_ _proto _ _)


每个对象都会有一个属性__proto__,指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有__proto__原型的存在


console.log(a)


这里我们打印了一下对象a:


1174b04b7a5146799985012af02b6d0f.png


我们会发现__proto__指向了我们的构造函数的原型对象Player.prototype

我们可以做一个测试:


console.log(a.__proto__ === Player.prototype);  //true


控制台打印的是true,因此断定,__proto__指向了构造函数原型对象


方法查找规则


首先看对象a身上是否有play方法,如果有就执行这个对象身上的play

如果没有play这个方法,因为有__proto__的存在,就去构造函数原型对象prototype身上去找play这个方法


原型链


既然了解了原型,那么原型链理解着也相当容易,我们知道__proto__指向构造函数的原型对象,那么有没有考虑到构造函数的原型对象的原型是谁呢?我们先来打印一下:

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


打印出结果为true,所以我们得出构造函数的原型对象的原型是:Object.prototype,由此我们继续寻找Object.prototype.__proto__,结果打印出是null。


这种一次向上寻找的过程形成了一个链,这就是原型链


0e91c5ea28c14265a7a9cf7d5121c46b.png


这个图为原型链的描述,图中的constructor是指向构造函数的意思.


小结


在前端面试的过程中,面试必问的基础知识点就是原型和原型链,因此必须要去深入理解,并去掌握它,主要是搞懂它们的实现原理,实现的过程,希望大家能够打好js基础,基础不牢,地动山摇!

相关文章
|
11天前
|
JavaScript 前端开发
js开发:请解释原型继承和类继承的区别。
JavaScript中的原型继承和类继承用于共享对象属性和方法。原型继承通过原型链实现共享,节省内存,但不支持私有属性。
19 0
|
11天前
|
JavaScript 前端开发
谈谈对 JavaScript 中的原型链的理解。
JavaScript中的原型链是实现继承和共享属性的关键机制,它通过对象的`prototype`属性连接原型对象。当访问对象属性时,若对象本身没有该属性,则会查找原型链。此机制减少内存占用,实现代码复用。例如,实例对象可继承原型对象的方法。原型链也用于继承,子类通过原型链获取父类属性和方法。然而,原型属性共享可能导致数据冲突,且查找过程可能影响性能。理解原型链对JavaScript面向对象编程至关重要。如有更多问题,欢迎继续探讨😊
16 3
|
11天前
|
JavaScript 前端开发 安全
JavaScript原型链的使用
【4月更文挑战第22天】JavaScript中的原型链是理解继承的关键,它允许对象复用属性和方法,减少代码冗余。示例展示如何通过原型链实现继承、扩展内置对象、构造函数与原型链的关系以及查找机制。应注意避免修改`Object.prototype`,使用安全方式设置原型链,并谨慎处理构造函数和副作用。
|
6天前
|
JavaScript 前端开发
前端 JS 经典:原型和原型链
前端 JS 经典:原型和原型链
12 0
|
9天前
|
前端开发 JavaScript
前端 js 经典:原型对象和原型链
前端 js 经典:原型对象和原型链
20 1
|
9天前
|
JavaScript
js中如何使用工厂方式和构造函数创建对象,web开发项目实例
js中如何使用工厂方式和构造函数创建对象,web开发项目实例
|
10天前
|
JavaScript 前端开发
JavaScript 原型链继承:掌握面向对象的基础
JavaScript 原型链继承:掌握面向对象的基础
|
10天前
|
JavaScript 前端开发
JavaScript构造函数模式:创建对象的另一种方式!
JavaScript构造函数模式:创建对象的另一种方式!
|
11天前
|
JavaScript 前端开发
在JavaScript中,函数原型(Function Prototype)是一个特殊的对象
【5月更文挑战第11天】JavaScript中的函数原型是一个特殊对象,它为所有函数实例提供共享的方法和属性。每个函数在创建时都有一个`prototype`属性,指向原型对象。利用原型,我们可以向所有实例添加方法和属性,实现继承。例如,我们定义一个`Person`函数,向其原型添加`greet`方法,然后创建实例`john`和`jane`,它们都能调用这个方法。尽管可以直接在原型上添加方法,但推荐在构造函数内部定义以封装数据和逻辑。
21 2
|
11天前
|
JavaScript 前端开发
JavaScript原型链:工作原理与深入探究
【4月更文挑战第22天】JavaScript原型链是对象属性查找的关键,它通过对象间的链接形成链式结构。当访问属性时,JS从对象自身开始查找,若未找到则沿原型链向上搜索,直至`null`。原型链用于继承、扩展内置对象和实现多态,但要注意避免修改内置对象原型、控制链长度及使用`Object.create()`创建对象。理解并合理运用原型链能深化JS面向对象编程的理解。