原型题-解析

题目如下:

function Fun(){ 
     var getName = function(){ 
         console.log(1); 
     } 
     return this; 
 } 
 Fun.getName = function(){ 
     console.log(2); 
 } 
 Fun.prototype.getName = function(){ 
     console.log(3); 
 } 
 var getName = function(){ 
     console.log(4); 
 } 
 function getName(){ 
     console.log(5); 
 } 
 Fun().getName();    
 getName();  
 Fun();  
 new Fun().getName();  
 new new Fun().getName(); 

结果:

 Fun().getName();  // 4  
 getName(); // 4 
 Fun(); // 无输出 返回Window对象 
 new Fun().getName(); // 3 
 new new Fun().getName(); // 3 

首先明白变量和函数提升, 函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖。

// 举例说明 变量和函数提升(懂的自动跳过)

a()     
function a() { 
    console.log(1)  
} 
var a = function(){ 
    console.log(2) 
}  
a() 
// 输出: 1 , 2 
// 执行的代码顺序如下 
function a() { 
    console.log(1)  
}; 
var a; 
a() // 输出 1 
a = function(){ 
    console.log(2) 
}  
a() // 输出2  
详细解析:

题目中变量提升后的写法(方便李姐)

// getName 变量提升 
function getName(){ 
     console.log(5); 
 } 
function Fun(){ 
     var getName = function(){ 
         console.log(1); 
     } 
     return this; 
 } 
var getName; 
// 属性上添加getName 
Fun.getName = function(){ 
     console.log(2); 
} 
// 原型上添加方法 
Fun.prototype.getName = function(){ 
     console.log(3); 
} 
getName = function(){ 
     console.log(4); 
} 
Fun().getName();    
getName();  
Fun();  
new Fun().getName();  
new new Fun().getName() 
1. Fun().getName()

首先执行Fun()时,返回this,这里指向window,相当于 window.getName() , getName最后被

console.log(4) 的函数赋值;

所以输出: 4;

2.getName()

相当于执行 window.getName(), 同上。

输出:4;

3.Fun()

返回this, 当前环境 window

4.new Fun().getName()

这里的执行顺序是 1.先 new Fun() 2.再执行getName()

  // 相当于执行 
  var fn = new Fun()    
  fn.getName() 

执行new Fun() 实例化的对象 后 , getName()方法实会去 Fun构造函数中找,没找到然后会去原型 prototype上去找getName。
这里原型链有该函数,调用

// 搞清楚 如下 
function A(){ 
    this.names = "ab" 
} 
A.names = "kk" 
A.prototype.names = "99" 
var a = new A() 
console.log(a.names) // ab 
console.log(A.names) // kk 
5.new new Fun().getName()

执行顺序: 1. new Fun() 2. new Fun.prototype.getName()

// 相当于执行 
var Fn1 = new Fun()    
var Fn2 = Fn1.getName  
new Fn2() 

上一篇
this 和 构造函数有return this 和 构造函数有return
一、 es5中 this 1.在普通函数中的this总是代表他的直接调用者,默认情况下指向windos 2.在严格模式下,没有直接调用者的函数中的this是undefined使用 3.call,apply,bind,thi
2020-08-11
下一篇
回流 重绘 回流 重绘
一、概念 dom-tree: 浏览器把获取到的HTML代码解析成1个DOM树,DOM树里包含了所有HTML标签,包括display:none隐藏,还有用JS动态添加的元素等。 样式结构体: 浏览器把所有样式(用户定义的CSS和用户代理)解
2020-07-22 丁祖科