JavaScript中函数声明,函数提升,对象属性和原型属性等问题
来源:互联网 发布:中国税务网络大学安装 编辑:程序博客网 时间:2024/05/18 15:52
function Foo() { getNumber = function () { console.log (1); }; return this;}Foo.getNumber = function () { console.log (2);};Foo.prototype.getNumber = function () { console.log (3);};var getNumber = function () { console.log (4);};function getNumber() { console.log (5);}
则:
1. Foo.getNumber();//22. getNumber();//43. Foo().getNumber();//14. getNumber();//15. new Foo.getNumber();//26. new Foo().getNumber();//37. new new Foo().getNumber();//3分析如下:
(1)第一问,首先定义了Foo函数,该函数为全局变量getNumber(这里的变量)创建了一个getNumber方法。之后又为Foo创建了一个getNumber(这里的是属性)的静态属性并存储了一个匿名函数。
第一问毫无疑问是访问的Foo的静态属性,因此输出2;
(2)第二问,getNumber()方法直接指向window对象,即window对象调用getNumber方法。此时涉及到函数提升的问题。
var getNumber=function(){...}这个为函数表达式,function getNumber(){...}为函数声明,函数声明能提升函数到这一层最上面,所以实际上的执行顺序是:
function getNumber() { console.log (5);}var getNumber = function () { console.log (4);};下面的函数表达式覆盖了上面的函数声明,所以此时的getNumber输出4,属于window对象,因此这一问输出4.
(3)第三问,Foo().getNumber(),这里Foo()执行了该函数,返回this,因为这里是window调用Foo,因此Foo()返回的是window,也就是window.getNumber(),因为getNumber前面没有var,所以指向window的getNumber,因此window的getNumber被重新覆盖,调用该方法后输出1;
(4)第四问,这里直接调用了window的getNumber,因为已经被第三问修改,所以这里还是输出1;
(5)‘.’的优先级高于new,因此从左往右执行,因为构造函数Foo.getNumber()没有返回值,因此直接实例化对象,并输出2;
(6)括号的优先级高于new,因此,执行顺序为
(new Foo()).getNumber()
改构造函数返回实例化对象本身,之后调用实例化对象的getNumber函数,因为构造函数并没有为对象添加任何属性,因此到当前对象的原型对象(prototype)中寻找getName,因此输出3;
(7)执行顺序为
new ((new Foo()).getNumber()先初始化Foo的实例化对象,然后将其原型对象上的getNumber函数作为构造函数再次new
- JavaScript中函数声明,函数提升,对象属性和原型属性等问题
- JavaScript中常见的几种创建对象的方式:基于对象扩充属性和方法、基于工厂方式创建对象、基于构造函数和基于原型
- JavaScript中变量和函数声明的提升
- javascript中Object类原型对象的属性和方法
- js中函数对象的属性,函数原型属性length、name、prototype
- JavaScript构造函数及原型属性关系
- Javascript的原型对象和prototype属性
- javascript中构造函数和prototype属性
- JavaScript原型对象、原型属性、原型链
- 关于javascript变量声明、函数声明提升的问题
- javascript中的变量提升和函数声明提升
- javascript的变量声明和函数声明提升
- javascript的变量声明和函数声明提升
- 变量声明提升和函数声明提升
- javascript中的函数声明提升
- js中对象所属类、对象中原型属性以及构造函数三者的关系
- JavaScript学习笔记(十一) 函数name属性和函数的提升
- javascript中面向对象中对象,属性,原型链和一些扩展知识总结
- ResNet
- plsql添加连接方式
- Codeforces-831C Jury Marks
- 数组小和
- WebSocket 是什么原理?为什么可以实现持久连接?
- JavaScript中函数声明,函数提升,对象属性和原型属性等问题
- 最大团
- 为什么选择用weblogic而不用tomcat?
- 2017杭电多校联赛6-Inversion-排序-hdu6098
- 修改文件名
- [BZOJ2684][USACO 2004 FEB]距离询问
- Matlab画折线图(线上有点)
- 经典DP——最长公共子序列
- Gym