function foo(){
foo.abc = function(){alert('def')}
this.abc = function(){alert('xyz')}
abc = function(){alert('@@@@@')};
var abc = function(){alert('$$$$$$')}
}
foo.prototype.abc = function(){alert('456');}
foo.abc = function(){alert('123');}
var f = new foo();
f.abc();
foo.abc();
abc();
理解方式基本同上,但是要将function以一个object的方式理解。以下顺序执行:
[code="js"]var foo = {}; //定义一个名为foo的空方法,也是没有内容的空类
foo.prototype.abc = function(){alert('456');} //给foo类增加原型方法,效果等同于实现该类的方法都可以使用abc()--1
foo.abc = function(){alert('123');}//给foo类增加类方法,可以使用foo类直接调用--2
var f = new foo();//实现foo类,并调用foo()方法
foo = function(){
foo.abc = function(){alert('def')} //效果等同于2处方法,直接给foo类增加类方法。这个无论写在那里都一样--3
this.abc = function(){alert('xyz')} //给当前域(即foo对象),增加一个对象方法。效果与1处相同。但存在区别,这里需要先将实现foo类,生成对应的对象,在其中对象设置一个abc方法,那么每个foo对象都会有一个abc方法。而设置原型方法只会申请一处内存。--4
abc = function(){alert('@@@@@')};//全局变量,,被设置到window中,可以通过winodw.abc()或abc()访问 --5
var abc = function(){alert('$$$$$$')} //局部不可见,覆盖上面abc()方法--6
}
f.abc(); //调用的方法包括本来是2处,但被3处覆盖,显示def
foo.abc();//调用方法包括本来是1处,被4处覆盖,显示xyz
abc(); //调用方法包括本来是5处,但5处方法被隐藏,,无法调用,报错!
[/code]
lz可以这么理解
[code="js"]
function foo(){
foo.abc = function(){alert('def')} //此方法针对于类foo
this.abc = function(){alert('xyz')} //给方法针对于类foo的实例
abc = function(){alert('@@@@@')}; //局部方法 外部不可见
var abc = function(){alert('$$$$$$')} //同上
}
foo.prototype.abc = function(){alert('456');} //此方法针对foo的原型
foo.abc = function(){alert('123');} //此方法针对类foo,运行到此处foo.abc的结果是123
var f = new foo(); //创建了一个foo对象,此处调用了了foo的"构造方法",foo.abc被覆盖,结果为def
f.abc(); //返回xyz
foo.abc(); //返回def
abc(); //未定义该方法
[/code]
[code="js"]
foo.prototype.abc = function(){alert('456');}
[/code]
其中以上这段代码的用处是
当foo类未定义 [code="js"] this.abc = function(){alert('xyz')} [/code]
时,
调用f.abc()则按照以下过程:
1. 查找foo的内部是否定义了abc方法 如定义,则调用;如未定义,到2
2. 查找foo.prototype,看是否定义了abc,如定义,则调用;如未定义,到3
3. 查找foo.prototype.prototype,看是否定义了abc,如定义,则调用;未定义,到4
4. 。。。直至返回Object.pototype如未定义,则返回该方法为定义的错误
因此,,1楼关于abc = function(){alert('@@@@@')};的解释是错误的。
this.abc = function(){alert('xyz')} 也不是实例方法,而是重新声明的方法,所以在内存中有不同的引用。