JavaScript学习笔记(一)

今天看到一段代码觉得挺有意思的。包含了很多知识就拿来和大家分享下,不对的地方请拍砖

function foo(){ 
foo.abc=function(){alert(1)} 
this.abc=function(){alert(2)} 
abc=function(){alert(3)} 
var abc=function(){alert(4)} 
} 
foo.prototype.abc=function(){alert(5)}; 
foo.abc=function(){alert(6)} 
var obj=new foo(); 
obj.abc(); 
foo.abc();

先来分析下代码里元素组成
foo 函数
obj对象

接下来分析函数foo内部结构
foo.abc  foo是函数foo.abc就是函数的属性了(不是对象的属性不要搞混了)
this.abc this指向foo构造函数实例化(new foo())后的对象
abc 前面没有加var就是默认的全局变量window.abc
var abc 局部变量生命周期只存在于foo函数里

接着往下看
foo.prototype.abc  prototype对象的原型 这里引用javascript权威指南里一段话“一个对象的原型是由创建并初始化该对象的构造函数定义的”这里的对象就是指new foo(),对象的原型可以表面的理解为java里父类,对象就是对象原型的子类,子类可以继承父类的方法

foo.abc 一样是函数的属性

var obj = new foo();实例化一个对象
obj.abc(); 运行对象的abc方法
foo.abc(); 运行函数foo的abc方法

为了更好看清运行时对象的变化请debugger;运行

JavaScript学习笔记(一)_第1张图片

foo函数的内部结构还没有开始执行的时候,obj作用域里已经有abc属性了。此时对象obj的属性abc是 alert5  foo函数的属性abc是6

在往下走foo.abc会覆盖原来的alert5,this.abc会覆盖原来的alert6

结果就是obj.abc();//2 foo.abc();//1

在想往深处研究可以看看这个http://hi.baidu.com/mjy_camilla/item/77e9bbef2a6f58d9eb34c958

你可能感兴趣的:(作用域,对象,构造函数,javascript原型)