javascript对象---2 构造函数

本文详细介绍了JavaScript中构造函数的基本概念及其调用方式,深入探讨了构造函数与普通函数的区别,解释了如何通过构造函数创建对象以及构造函数内部this指针的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.理解JS对象实现的基础:

构造函数:函的得另一种方式,执行后创建对象,并创建原型对象。

原型链:对象访问构造函数的指针。

Function函数:函数对象,所有底层程序都要调用的函数。自己定义的构造函数,普通函数都是Function函数的子对象。

Object函数:所有创建对象的祖辈对象,是Function对象的祖辈,也是由Function对象实现的。

二. 构造函数

1.构造函数的声明方式与普通函数完全一致,但调用方式不同,返回的 结果内存 结构也不同,执行构造函数将会返回一个该构造函数对应的对象。

//构造函数 函数首字母大写 

//在函数体中与普通函数相比 this指针不同

//与普通函数相比,调用方式不同    new Fun();---构造函数

//构造函数一般用作创建一个类,实现类似类的功能,在JAVA中类名的编写规范,首字母大写,因此遵循这个规范首字母大写----让别人识别 以大写开头,要 以构造函数方式调用

function Fun(){   
            
 }

Fun();      //普通函数调用方式

var fun = new Fun();  //构造函数的调用方式  --初始化一个构造函数

 

2. new Fun() 的执行过程

1.创建了一个空对象obj.

2.空对象空对象原型链(_proto_)指向了函数对象 prototype对象。

3.修改对象的this指针名为对象创建新的对象引用。

4.执行函数体

在new Function时创建了一个函数对象, 同时创建了一个原型对象

Fun函数对象{

prototype:地址:  访问 Fun的 prototype对象

}

Fun的 prototype对象{ //函数原型对象

constructor:

__proto__: //原型链

prototype是一个最简单的对象

普通对象没有 prototype对象

new 了一个Fun 创建了一个空对象,对象内有一个属性

{

     __proto__:地址

}
 

3.修改对象的this指针名为对象创建新的对象引用。

普通函数调用时

function Fun(){   
        var that1= this;   //必须先引用才能给函数中 this 赋值,否则 this值为 undefined   
 }

Fun();      //普通函数调用方式

普通函数调用此时 this :window对象--运行环境对象

this在其他语言中,代表当前对象,但在js中非常灵活--六种规则

1. this 是跟当前函数的运行环境有关

对于普通函数来说:在函数体中 this 代表调用当前函数的运行环境对象 Fun();   相当于是最外层window调用的 this指window

function  Fun(){

var that1 =this;

innerFun( );

function  innerFun(){        短暂时间内  innerFun()在栈内存

    var that2 =  this;                that2 : window

}

}

 按理说 innerFun( )在 Fun()中调用--this 应当指的是Fun() 但错误

js的运行过程导致--

预编译 Fun() ;作为全局函数保存在对象中

Fun() ;隶属于window 对象, window对象为Fun()的运行环境,this 指向 window 对象

运行到--调用 innerFun();已经在内存中,在 window全局对象中,在执行到 innerFun(),这个短暂的时间内, innerFun( ) ; 被加载到栈内存,其具体的函数对象在堆内存, 栈内存隶属于window对象的执行环境

this 指针指向 window 对象。 

Fun()函数作为普通对象,可以给他赋属性, 定义函数

Fun.userName = "Amy";

function Fun(){
                var that1 = this;
                function innerFun (){
                    var that2 = this;
                }
            }
            Fun.userName = "zhansan";
            Fun.innerFun2 = function(){ //绑定在函数对象身上
                var that3 = this;    //           
this :Fun( ); 指向当前函数对象
            }
            
            Fun.innerFun2() //普通函数调用

 

绿色部分在预编译时,没有进行---开始运行后逐个添加userName属性 ,innerFun2函数----由Fun 调用

innerFun2

 

4 . 对于构造函数来说,this 不是window对象。this 代表当前 fun 对象 , 运行后 fun 对象中生成 属性 id :1  name :adame ,  在构造函数中this指向发生问题。

普通函数中,this 代表 当前运行环境 谁调用 this 就指向谁。

在构造函数中 --用构造函数方式调用 Fun( ) ;这时 this 相当于你定义的接受变量,相当于给 fun里面加 Id 、name

function Fun(){
                this.id = 1;
                this.name = "adame"
            }
            
            //用构造函数运行
            var fun = new Fun() 

 

4.前三步执行完了,执行函数体

普通函数没有前三部。

转载于:https://my.oschina.net/u/2991733/blog/794412

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值