搜了下经典的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的更多相关文章

  1. JS Foo.getName笔试题解析,杂谈静态属性与实例属性,变量提升,this指向,new一个函数的过程

     壹 ❀ 引 Foo.getName算是一道比较老的面试题了,大致百度了一下在17年就有相关文章在介绍它,遗憾的是我在19年才遇到,比较奇妙的是现在仍有公司会使用这道题.相关解析网上是有的,这里我站在 ...

  2. 【编码题篇】收集整理来自网络上的一些常见的 经典前端、H5面试题 Web前端开发面试题

    编写一个方法 求一个字符串的字节长度假设:一个英文字符占用一个字节,一个中文字符占用两个字节 function GetBytes(str){ var len = str.length; var byt ...

  3. 一道经典的js面试题

    # 声明:学习编程语言最好的方式就是通过实例学习 ## 下面是我在博客上看到的一道js面试题,可以说非常经典,下面会以最简单的方式让你理解题目:```bashfunction Foo() { getN ...

  4. 关于foo的一个面试题

    今天看到一个关于foo的一个面试题,赶脚特别有意思 function foo(){// 第16行 getName = function(){console.log(1)} return this } ...

  5. js高频经典面试题总结

    类型转换问题 console.log(null>=0); console.log(null<=0); console.log(null==0); console.log(undefined ...

  6. js 中对于this 的理解的 经典案例

    function Foo(){ getName = function(){console.log(1);}; return this; }Foo.getName = function(){consol ...

  7. JS核心系列:理解 new 的运行机制

    和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...

  8. 前端试题本(Javascript篇)

    JS1. 下面这个JS程序的输出是什么:JS2.下面的JS程序输出是什么:JS3.页面有一个按钮button id为 button1,通过原生的js如何禁用?JS4.页面有一个按钮button id为 ...

  9. JavaScript 函数的两种声明方式

    1.函数声明的方式 JavaScript声明函数有两种选择:函数声明法,表达式定义法. 函数声明法 function sum (num1 ,num2){ return num1+num2 } 表达式定 ...

随机推荐

  1. C# Newtonsoft.Json JsonSerializerSettings 全局序列化设置

    Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings(); JsonC ...

  2. (Review cs231n) ConvNet

    概念 神经网络的深度和数据据体的深度(图像的通道数channels)要主要区分. 输入 1.得到一些数据,作为网络的输入. 2.在CNN中有filter,the size of filter is s ...

  3. python 装饰器(语法糖)

    def  login(func):    def testlogin():        for  i in range(3):            _username="abc" ...

  4. 常见的python的unittest用法

    python的unittest好处是通过python脚本编写用例,每个用例可以单独调试初始化和清理动作,因为都是用例都是代码所以调试起来也很方便:它的缺点是得先学会python,难易程度见仁见智吧,对 ...

  5. Python 静态方法,类方法,属性方法

    方法的使用 静态方法 - 只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性. class Dog(object): def __init__(self,name): self.nam ...

  6. 解决apache httpd列出目录列表中文乱码问题

    问题: 找了好几个方法都不对, 很多都是说修改AddDefaultCharset字段的, 下面是新的方法, 新测可行 在httpd.conf下, 随便找个地方把下面这个字段扔上去, 重启即可 Inde ...

  7. img 兼容问题 css图片与图片之间总是会存在缝隙

    解决方案: 法宝一:定义图片img标签vertical-align:bottom,vertical-align:middle,vertical-align:top. img{vertical-alig ...

  8. [C++ Primer Plus] 第5章、循环和关系表达式(一)程序清单——指针自加减优先级

    程序5.4 #include<iostream> using namespace std; ; void main() { long long factorials[Size]; fact ...

  9. 剑指offer(48)不用加减乘除做加法

    题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目分析 不用加减乘除做加法,我第一时间想到的就是用位运算,毕竟计算机是二进制的,所有的操作都是以位运算为基础 ...

  10. 关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)

    概述 数据切片器在电子商务网站上很常见 - 它们可以帮助用户快速过滤所选商品,并且所有过滤选项都可以在一个地方使用,通常包含核心控件类型为:清单,范围栏和单选按钮等.在ComponentOne For ...