javascript的类中没有私有成员呀,对象的封装性如何保证呀?
看来,观念的转变是不容易的。
按面向对象的观点,对象的特点是继承,封装,多态,
javascript中,首先不江满足封装,因为通过prototype属性,可以对对象的原型进行修改,就比如对类的内部进行修改一样。
实际我理解,对象的prototype属性,就是“类”,因为对它一修改,所有类的实际全会发生变化。
所以封装性基本上没有了。 <script type="text/javascript"> function myfun(name,age) {
this.name=name;
this.age=age
this.showme=function(){
alert(this.name.toString()+"-"+this.age.toString())
}
} var a=new myfun("小王",50)
a.showme(); //以下代码,相当于对类进行修改
myfun.prototype.showtmp=function(){
alert("定义prototype后的显示");
} //对修改前就实例化的对象,竟然产生作用了
a.showtmp();
</script>
再说继承。好象javascript中,直能是变通实现,也要借助于 prototype 属性。再说多态。好象javascript中没有虚函数,所以也无法实现真正的多态。如果这样的话,javascript中的面向对象特性,体现在何处呢?
js简直是太灵活了。
看来,观念的转变是不容易的。
按面向对象的观点,对象的特点是继承,封装,多态,
javascript中,首先不江满足封装,因为通过prototype属性,可以对对象的原型进行修改,就比如对类的内部进行修改一样。
实际我理解,对象的prototype属性,就是“类”,因为对它一修改,所有类的实际全会发生变化。
所以封装性基本上没有了。 <script type="text/javascript"> function myfun(name,age) {
this.name=name;
this.age=age
this.showme=function(){
alert(this.name.toString()+"-"+this.age.toString())
}
} var a=new myfun("小王",50)
a.showme(); //以下代码,相当于对类进行修改
myfun.prototype.showtmp=function(){
alert("定义prototype后的显示");
} //对修改前就实例化的对象,竟然产生作用了
a.showtmp();
</script>
再说继承。好象javascript中,直能是变通实现,也要借助于 prototype 属性。再说多态。好象javascript中没有虚函数,所以也无法实现真正的多态。如果这样的话,javascript中的面向对象特性,体现在何处呢?
js简直是太灵活了。
var sex = true; //私有滴
this.name=name;
this.age=age
this.getSex = function() { return sex;};
this.showme=function(){
alert(this.name.toString()+"-"+this.age.toString())
}
}
--------------------------
但是这个 sex 成员可以随便改呀,
a.sex="adf"
b.sex="dd"封装性如何体现呢?
prototype属性,我的理解就是“属性”,最多是“属性”+“方法”;
继承有,多态无,至于封装性的问题,我不知道你说的是不是闭包问题,我正在琢磨这个,有点深奥,摸索中...
var sex = true; //私有滴
this.name=name;
this.age=age
this.getSex = function() { return sex;};
this.showme=function(){
alert(this.name.toString()+"-"+this.age.toString())
}
}
a=new myfun("zzzz",66)
a.sex="男"
alert(a.sex) </script>
但是这里 a.sex是可以访问,并且可以修改呀。
你直接alert(a.sex)是undefined;
因为私有属性不可访问。
但是你又 a.sex = '男' 相当于创建了一个新的public属性sex,仅此而已,但是内部的sex并没有改变。
alert(a.getSex());
这个才是弹出的私有sex的值。
此处是给对象a动态添加了一个属性sex,此处的sex和var sex=true处的sex不是同一个东西。看下面的代码
<script type="text/javascript"> function myfun(name,age) {
// var sex = true; //私有滴
this.name=name;
this.age=age
this.getSex = function() { return sex;};
this.showme=function(){
alert(this.name.toString()+"-"+this.age.toString());
}
}
a=new myfun("zzzz",66);
b = new myfun("abc",30);
a.sex="男";
alert(a.sex);
alert(b.sex);</script>
this(this.a = 1) 对象的
什么都不加(a = 1) 全局的(window的)
谁能用代码证实,私有成员不会被修改呢? function myfun(name,age,s) {
var sex; //这个是私有的吗
this.name=name;
this.age=age
this.sex=s;
this.GetSex=function(){return (this.sex)}
}
a=new myfun("zzzz",66,"女")
a.sex="男"
alert(a.sex)
alert(a.GetSex())
var sex
this.sex
你传参进来赋值的参数又是什么?
你在GetSex的时候调用的是什么?
始终没有用到sex 你没发现吗 function myfun(name,age) {
var sex = true; //私有滴
this.name=name;
this.age=age
this.getSex = function() { return sex;};
this.showme=function(){
alert(this.name.toString()+"-"+this.age.toString())
}
}
a=new myfun("zzzz",66)
a.sex="男"
alert(a.sex)
alert(a.getSex());
TRY
a.sex="男"
alert(a.sex)
alert(a.GetSex())
------------------------
初始化时为女,按理私有sex为女,
a.sex="男",并不会改变私有的。
但是代码中可见,确实变成男的了。
楼主一定要钻牛角尖没人管你。
9楼里面有个返回私有sex属性的getSex方法你不用,偏要改成返回公共sex属性的getSex方法。
你这就是抬杠。
<script>
function obj(){
var p = '我就是私有的,你不通过set方法根本没法改变我!也必须通过内部get方法获取我!'; //私有p
this.setP = function(v){
p = v;
return this;
}
this.getP = function(){
return p;
}
this.p = '我就是公有的!'
}
var o = new obj;
alert('公有p----' + o.p);
alert('私有p-----' + o.getP());
alert('我改变后的私有p-------' + o.setP('我是私有p,被改变了!').getP());
</script>
原来 sex前加上 this,就变成公有的了。
我不知道呀,不是抬扛。