JS类成员作用域研究
作者:大石头  来源:  发布时间:2006-12-25 10:03:17  共有500位读者阅读过此文
声明方式 访问方式
类内 类外
成员 this.成员 类名.prototype.成员 类名.成员 对象.成员 类名.prototype.成员 类名.成员 备注
基类 类内 var 成员 支持 undefined undefined undefined undefined undefined undefined 仅测试属性
this.成员 未定义 支持 undefined undefined 支持 undefined undefined 仅测试属性
类外 类名.prototype.成员 未定义 支持 支持 undefined 支持 支持 undefined 仅测试属性
类名.成员 未定义 undefined undefined 支持 undefined undefined 支持 仅测试属性
继承 类内 var 成员 未定义 undefined undefined undefined undefined undefined undefined 仅测试属性
this.成员 未定义 支持 支持 undefined 支持 支持 undefined 仅测试属性
类外 类名.prototype.成员 未定义 支持 支持 undefined 支持 支持 undefined 仅测试属性
类名.成员 未定义 undefined undefined undefined undefined undefined undefined 仅测试属性
结论
1 var 成员 声明的是私有成员,别的方式无法访问,即使派生类也无法访问
2 this.成员 经过继承后,在派生类中用 类名.prototype.成员 也能访问了,基类则不行 这说明基类的普通成员经过继承后,成为派生类的原型成员
3 类名.成员 是以类为对象声明成员,别的方式无法访问,即使派生类也无法访问
4 对象.成员 形式访问原型成员时,会产生写复制, 该对象的该成员指向独享的新的副本
5 同时声明this.成员和原型成员会有冲突, 同等条件下(相同访问方式),优先使用this.成员
6 类名.成员和原型成员挺相似的,只是原型成员对外多了个只读且可被继承
7 原型方法和类.方法成员 中声明的this.成员将会自动成为类的原型成员,因为原型方法只能访问原型成员,类对象只能访问类对象。原型成员和类.成员可以在类定义后的任意地方定义,感觉就是想要什么成员就有什么成员,用了就有了
8 var cc=0;
function clsPerson()
{
//var i = 666;
this.i = 777;
// 属性 类有固定的属性,类的实例却可以有不同的属性
this.Name = ""; // 名字
// 方法
this.Run = function()
{
document.write("<br>" + this.Name + " 跑呀……");
}
clsPerson.w=678;
clsPerson.prototype.j = 89;
if (cc==0)
{
cc=1;
//test2("内 var i", i);
test2("内 this.i", this.i);
test2("内 clsPerson.prototype.i", clsPerson.prototype.i);
test2("内 clsPerson.i", clsPerson.i);
}
}
function pp()
{
//test2("继承内 var i", i);
test2("继承内 this.i", this.i);
test2("继承内 pp.prototype.i", pp.prototype.i);
test2("继承内 pp.i", pp.i);
}
//clsPerson.prototype.i = 888;
//clsPerson.i = 999;
var AA = new clsPerson();
test2("外 AA.i", AA.i);
test2("外 clsPerson.prototype.i", clsPerson.prototype.i);
test2("外 clsPerson.i", clsPerson.i);
pp.prototype=AA;
var BB = new pp();
//clsPerson.prototype.i = 888;
//clsPerson.i = 999;
test2("继承外 BB.i", BB.i);
test2("继承外 pp.prototype.i", pp.prototype.i);
test2("继承外 pp.i", pp.i);
test2("外 clsPerson.prototype.k", clsPerson.prototype.k);
clsPerson.prototype.Add = function()
{
this.k = 5+55000;
}
test2("外 clsPerson.prototype.k", clsPerson.prototype.k);
clsPerson.prototype.Add();
test2("外 clsPerson.prototype.k", clsPerson.prototype.k);
test2("外 clsPerson.m", clsPerson.m);
clsPerson.inc = function()
{
this.m=1234;
}
clsPerson.inc();
test2("外 clsPerson.m", clsPerson.m);
test2("外 clsPerson.w", clsPerson.w);
test2("外 clsPerson.prototype.j", clsPerson.prototype.j);

 

新生命 XCMS1.0 Build0206 版权所有 All Copyrights @2009 桂ICP备06011573号
站长:大石头 信箱:gxuhy@21cn.com QQ:99363590
本站带宽由酷睿数据提供