new-this-原型-预编译笔试题

本文详细剖析了JavaScript中函数的作用域、this的指向变化,通过实例展示了fn、rank函数和变量的交互,以及new关键字在对象创建中的影响。重点讲解了构造函数中的this指向和原型链查找过程。

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

function fn() {
    rank = function() {alert("虞姬")}
	console.log(this);
	return this
}
fn.rank = function() {alert("王昭君")}
fn.prototype.rank = function() {alert("西施")}
var rank = function() {alert("貂蝉")}			
function rank() {alert('杨玉环')}

fn.rank()      
rank()      
fn().rank()  
rank()      
new fn.rank()
new fn().rank() 
new new fn().rank() 

某一个作用域中代码的运行流程:

形参声明/变量声明  实参赋值  函数提升  运行代码

var rank;
function fn() {
    rank = function() {alert("虞姬")}
	console.log(this);
	return this
}
function rank() {alert('杨玉环')}
fn.rank = function() {alert("王昭君")}
fn.prototype.rank = function() {alert("西施")}
rank = function() {alert("貂蝉")}
fn.rank()//弹出王昭君
//找最近的fn.rank(): fn.rank = function() {alert("王昭君")}


rank()//弹出貂蝉
//找最近的rank函数:rank = function() {alert("貂蝉")}


fn().rank()//打印 window   弹出虞姬
//先找fn函数运行:function fn() {
//    rank = function() {alert("虞姬")}
//    console.log(this);
//    return this
//}
//改变了rank为:rank=function() {alert("虞姬")},打印this为window,返回window,
//然后window.rank(),弹出虞姬


rank()//弹出虞姬
//rank函数改变了为:rank=function() {alert("虞姬")},所以弹出虞姬


new fn.rank()//弹出王昭君
//成员访问|new 带参  > new 无参|函数调用
//new (fn.rank) () ==> new 函数 ()
//所以弹出王昭君


new fn().rank()//弹出西施
//先进行new fn(),将rank的值改为:rank=function() {alert("虞姬")},打印this,为创造的对象fn,返回fn,
//然后对象fn没有rank方法,在原型链上找:fn.prototype.rank = function() {alert("西施")},所以弹出西施。


new new fn().rank() //弹出西施
//根据成员访问|new 带参  > new 无参|函数调用
//new ((new fn()).rank) ()
//先new fn()将rank的值改为:rank=function() {alert("虞姬")},打印this,为创造的对象fn,返回fn,
//然后对象fn没有rank方法,在原型链上找:fn.prototype.rank = function() {alert("西施")},创建对象运行,弹出西施

在调用new的过程中都发生了什么?

1.创建一个空对象 ==> 创建一个空对象{} 给它添加一个属性proto这个属性引用fn.prototye

​2.运行构造函数,让内部的this指向创建的对象(用创建的空对象去调用构造函数),给创建的对象添加属性。函数内部的this就是创建的对象。

​3. 整个表达式的结果看函数的返回值:​

        3.1返回值是引用数据 那么就是返回值

​        3.2返回值不是引用数据 那么就是这个运行完毕之后的创建的那个对象

this代表的是 执行这个this代码的环境对象

​ this基本上就代表的是对象 在及其少的时候 this不是对象=>call apply bind

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值