一.理解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.前三步执行完了,执行函数体
普通函数没有前三部。