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构造函数
//var getname:全局定义一个变量叫getname
//function getname(){ 5 } 定义一个全局变量叫getname 为5号函数
//预解析结束的时候 getname是一个五号函数
// 执行 第一部分
// 1 foo.getname=function(){ 2 }
// =>把foo当做对象 里面添加了一个二号函数
// =>不是给foo的实例使用的 要是给实例使用 应该加在prototype上(给实例使用应该调用的是3号函数)
// =>是给foo使用的 需要写foo.getname()
// 2 foo.prototype.getname=function(){3}
// =>向foo的原型上添加一个3号函数
// =>将来给foo的实例使用的 怎么调用呢 foo的实例.getname(),foo.prototype.getname()
// 3 getname=function(){4}
// =>给全局变量getname进行赋值
// =>全局变量getname本身存储的是5号函数 现在给他赋值为四号函数,5号函数被覆盖
// =>从现在开始再也没有5号函数了
// =>现在开始 全局getname是4号函数
// 第二部分 代码执行
// foo.getname()
// => 把foo当做一个对象,调用他身上的getname的成员
// => foo自己身上的getname成员存储的是2号函数
// => 结果是2
// getname()
// => 调用全局getname函数
// => 全局getname函数在第一部分执行的时候 已经变成了四号函数
// => 4
// foo().getname()
// => 先把foo执行一遍 然后用返回值调用getname
// =>1 执行foo
// =>先给getname赋值 但是自己作用域没有getname去上一级作用域查找
// =>给全局的getname赋值为1号函数
// =>全局的四号函数被覆盖了
// =>从此以后getname就是1号函数了
// =>return this (window) 这样的话foo().getname()就是windown.getname()
// =>2 使用返回值调用getname()
// =>window.getname() 输出1
// getname()
// =>又一次调入全局的getname函数 1
// new foo.getname()
// => new的是把foo当做对象的时候里面的那个函数
// => 找到foo.getname函数 实例化一下
// => new的过程就是把函数执行一遍
// => 这里foo.getname函数执行了一遍
// => 打印出来是2
// new foo().getname()
// => 先new foo函数 用实例对象调用getname函数
// => 先执行一遍foo 又一次把全局getname覆盖了
// => return this foo因为和new连用 ,本身this就是实例
// => 实例调用getname()
// => 实例自己身上没有 执行的是_proto_上面的getname
// => 实际上是foo.prototype上面的getname函数 结果:3
//
//
本来怎么想都想不通为什么foo().getname()为什么是1
可以看到haha里面没有a属性