先运行这一段代码试试看了
提示:您可以先修改部分代码再运行
在分析一下代码
- <script>
- 1. var foo = function(){};
- 2. foo.prototype.abc = function(){alert('456');};
- 3. foo.abc = function(){alert('123');};
- 4. var f = new foo();
- 5. f.abc();
- 6. foo.abc();
- </script>
复制代码
1. 定义一个空的对象foo
2. 扩展foo类的原型属性|方法 abc 由foo类创造的对象都会继承该属性|方法
3. foo对象重载了abc属性|方法|成员
4. 实例化一个foo类的对象f
5. f对象运行结果为 警告456
6. foo.abc()的运行结果为 警告123
为什么会这样?
第一 f对象是由foo类class派生出来的,继承了该foo类的所有属性和方法
第二 凭什么判断 var foo = function(){}; 既是是类且又是对象? 将这一句替换成var foo = new Object(); 运行会出错。foo.prototype has no properties 也就是foo对象不能扩展原型属性,foo类可以了
第三 f对象和foo对象都是引用类型值,指向不是内存里的同一个对象。所以foo.abc = function(){alert('123');}; foo对象的abc方法被重载了,而f.abc没有被重载,因为不是同一个对象。
现在再回过头来看原题目
提示:您可以先修改部分代码再运行
运行结果为 alert('xyz') 和 alert('def')
为什么又是这样的结果?
第一 为什么f.abc()运行结果是alert('def') foo.abc()运行的结果是 alert('xyz') ?
foo.abc = function(){alert('def')}; 代表的是实例对象foo的属性|方法abc,foo指向的是foo对象内存地址。this指向的是当前类派生对象的内存地址,所以f.abc被重载了。foo.abc总是指向foo.abc从构造函数中派生了之后就未被重载过了。
验证猜测将foo.abc = function(){alert('def')};与this.abc = function(){alert('xyz')};换一个位置
提示:您可以先修改部分代码再运行
这一次运行结果f.abc()运行结果是alert('xyz') foo.abc()运行的结果是 alert('def')
第二 为什么foo.abc = function(){alert('123');};没有将this.abc给重载?
排除干扰把foo.abc = function(){alert('def')};给删除掉
提示:您可以先修改部分代码再运行
运行结果为 xyz 和 123
第三 为什么foo.prototype.abc不能重载掉函数foo.abc = function(){alert('123');};
提示:您可以先修改部分代码再运行
等等还有很多疑问了。思考之后再回答这个问题
[ 本帖最后由 cssxp 于 2007-7-29 22:33 编辑 ] |