经典的Foo和getName
搜了下经典的Foo和getName的题目,看了几个解释,懒得看,自己解一下,作为笔记。
function Foo(){
getName = function(){
console.log(1);
};
return this;
} Foo.getName = function(){
console.log(2);
} Foo.prototype.getName = function(){
console.log(3);
} var getName = function(){
console.log(4);
} function getName(){
console.log(5);} //输出以下的输出结果 //函数Foo的静态方法
Foo.getName();// //function getName有提前声明的规则,声明后被var getName= 。。覆盖,则getName为4
getName();// //Foo()的return this为window,window.getName 在Foo里面被覆盖,则输出1
Foo().getName();// //同上,因调用了Foo();window的getName被覆盖
getName();// //依然只是调用了Foo对象上的getName,又因为Foo.getNname,所以相当于
/**
* function a(){console.log(2)};
* new a();
* **/
new Foo.getName();// //先执行了new Foo();返回一个对象,这个对象的getName为prototype上的getName,相当于(new Foo()).getName();
new Foo().getName();// //
new new Foo().getName();//
对于后三题,尤其是最后一个new new Foo().getName(),特别容易懵x
对于带new的输出,用一个this来跟踪。
function Foo(){
this.a = 1;
getName = function(){
this.a = 11;
console.log(1);
};
return this;
} Foo.getName = function(){
this.a = 2;
console.log(2);
} Foo.prototype.getName = function(){
console.log(3);
this.a = 3;
return "i'm prototype's getName";
} var getName = function(){
console.log(4);
this.a = 4;
} function getName(){
console.log(5);
this.a = 5;
}
//相当于 new (Foo.getName())
var a1 = new Foo.getName();//
console.log(a1.a);//2; //相当于 (new Foo()).getName(); 只是执行了一个prototype里getName()的方法,
//这个方法若无返回则a2为undefined,
//可以进一步确定,在prototype.getName中添加return ,则a2会等于return出来的结果
var a2 = new Foo().getName();//3
console.log(a2.a);//报错:cannot read property a of undefinded;
//这题输出的结果为3;从结果上看,相当于 new Foo.prototype.getName()
//也就是说new Foo().getName() == Foo.prototype.getName()
//所以执行的结果应该相当于 new ((new Foo()).getName())
//这句话用通俗点说法就是,new了一个Foo对象A,然后以A原型里的getName()方法作为构造函数new了B,最后这个B.a = 3;
//当然在new的时候执行构造器,就输出了3;
var a3 = new new Foo().getName();//3
console.log(a3.a);//3
经典的Foo和getName的更多相关文章
- JS Foo.getName笔试题解析,杂谈静态属性与实例属性,变量提升,this指向,new一个函数的过程
壹 ❀ 引 Foo.getName算是一道比较老的面试题了,大致百度了一下在17年就有相关文章在介绍它,遗憾的是我在19年才遇到,比较奇妙的是现在仍有公司会使用这道题.相关解析网上是有的,这里我站在 ...
- 【编码题篇】收集整理来自网络上的一些常见的 经典前端、H5面试题 Web前端开发面试题
编写一个方法 求一个字符串的字节长度假设:一个英文字符占用一个字节,一个中文字符占用两个字节 function GetBytes(str){ var len = str.length; var byt ...
- 一道经典的js面试题
# 声明:学习编程语言最好的方式就是通过实例学习 ## 下面是我在博客上看到的一道js面试题,可以说非常经典,下面会以最简单的方式让你理解题目:```bashfunction Foo() { getN ...
- 关于foo的一个面试题
今天看到一个关于foo的一个面试题,赶脚特别有意思 function foo(){// 第16行 getName = function(){console.log(1)} return this } ...
- js高频经典面试题总结
类型转换问题 console.log(null>=0); console.log(null<=0); console.log(null==0); console.log(undefined ...
- js 中对于this 的理解的 经典案例
function Foo(){ getName = function(){console.log(1);}; return this; }Foo.getName = function(){consol ...
- JS核心系列:理解 new 的运行机制
和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...
- 前端试题本(Javascript篇)
JS1. 下面这个JS程序的输出是什么:JS2.下面的JS程序输出是什么:JS3.页面有一个按钮button id为 button1,通过原生的js如何禁用?JS4.页面有一个按钮button id为 ...
- JavaScript 函数的两种声明方式
1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...
随机推荐
- Linux下的.txt文件复制到win下面不自动换行
原因:在Linux系统下, '\n'就是一个换行符,而在windows下,它是由回车换行组成,表示为 \r\n 解决方法:用Notepad++打开文档-->编辑-->文档格式转换--> ...
- https学习笔记二----基础密码学知识和python pycrypto库的介绍使用
在更详细的学习HTTPS之前,我也觉得很有必要学习下HTTPS经常用到的加密编码技术的背景知识.密码学是对报文进行编解码的机制和技巧.可以用来加密数据,比如数据加密常用的AES/ECB/PKCS5Pa ...
- 创建servlet程序知识点详解---servlet-day12
自定义标签 (1)编程步骤 step1 jsp标签分为复杂标签技术(old),简单标签(new) 注(了解) jsp标签技术分为复杂标签技术(old),简单标签技术(new) step2 ###MVC ...
- LeetCode258 各位相加
题目链接:https://leetcode-cn.com/problems/add-digits/ 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: ...
- win10忘记开机密码无法进入桌面
第一种: 电脑用微软账户登录,但密码始终不正确. 登陆这个网址 https://account.live.com/password/reset 按照提示的操作利用之前注册信息一步步重设密码 最后 ...
- H5兼容问题及解决方法
Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" content="wi ...
- Eclipse创建Maven Web项目后更改Servlet版本
Eclipse创建Maven Web项目后更改Servlet版本 1.场景基于Eclipse通过maven-archetype-webapp原型创建一个Web项目后,其默认Servlet版本是2.3, ...
- 常见的python的unittest用法
python的unittest好处是通过python脚本编写用例,每个用例可以单独调试初始化和清理动作,因为都是用例都是代码所以调试起来也很方便:它的缺点是得先学会python,难易程度见仁见智吧,对 ...
- Python 匿名变量
匿名变量的使用 calc = lambda x:x*3 print(calc(3)) 注:匿名变量是没有名字的变量 注:使用:lambda 创建.
- JavaScript自定义求和函数
我爱撸码,撸码使我感到快乐!大家好,我是Counter,当看到这个标题到时候是不是感觉很简单,千万不要大意哦,你说0.1 + 0.2 = 0.3 ?有时候计算机并不是我们所说绝对精确,这个时候就要我们 ...