为了账号安全,请及时绑定邮箱和手机立即绑定

在Javascript中,访问私有成员的成员方法是否可以写在类的原型中?

在Javascript中,访问私有成员的成员方法是否可以写在类的原型中?

肥皂起泡泡 2019-04-06 16:57:05
譬如我有一个Person类,拥有name这一私有属性。//Javascriptcode:functionPerson(theName){varname=theName;//对象的私有成员this.getName=function(){//访问私有成员的成员方法写在对象中是没有问题的。returnname;};}Person.prototype.setName=function(newName){//访问私有成员的成员方法是否可以写在类的原型中?};是不是需要访问到私有成员的成员方法都不能写在原型里?但是这样又会造成资源的浪费,有没有两全其美的方法?后来试过了做类构造的闭包,写成了这样://Javascriptcode:varPerson=(function(){varname;varP=function(theName){name=theName;this.getName=function(){returnname;};};P.prototype.setName=function(newName){name=newName;};returnP;}());很显然name变成了静态私有变量而不是成员私有变量。虽然可以创建静态字典,但是代码的可读性会降低。有没有其它的解决方法?
查看完整描述

2 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

一般采用约定,js不适合做这种强制限制,对性能和可读性都有影响。通用约定,一般是第一个字符是下划线的是私有方法和私有变量,外部不能调用。当然只是约定。。。。前端在实施的过程中,约定和规范很重要,比任何语言都重要。
一般一个团队一开始,做的第一项工作就是规范制定,之后就要遵循这些约定,否则很容易把前端代码写乱。
既然系统不给我们太多限制,我们就需要自己来限制自己。
                            
查看完整回答
反对 回复 2019-04-06
?
RISEBY

TA贡献1856条经验 获得超5个赞

个人觉得,在js中没必要一定要实现出传统的基于模板类的面向对象,虽然functionCls(){}
Cls.prototype={
constructor:Cls,
//....blabla
}这种是在各种书上很常见的code,但是我个人比较倾向的是类似这样的写法:functiongenPerson(n){
varname=n;
return{
getName:function(){returnname}
}
}通过闭包来维护私有变量。正如js是一门很灵活的脚本语言,所以ducktyping在这门语言里也可以起到一定的作用。在上面那个“类”或者“闭包”中,我认为,只要它有getName方法我就把它当作是人。在处理传入对象的时候仅仅只判断是否有该方法而不是判断其instanceof是否为true。functionprintName(person){
if(person&&person.getName){
console.log(person.getName())
}
}其实要实现你所想要的私有方法,把需要私有的内容写在闭包中就行。
                            
查看完整回答
反对 回复 2019-04-06
  • 2 回答
  • 0 关注
  • 292 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信