站长网_站长创业_站长主页_站长之家_易采站长站

会员投稿 投稿指南 站长资讯通告: 深入理解JavaScript系列(17):面向对象编程之概
搜索:
您的位置: 主页 > 教程 > 网页编程 > JavaScript > » 正文

深入理解JavaScript系列(17):面向对象编程之概论详细介绍(7)

来源: 易采站长站

这是一个很大的错误:为了隐藏使用隐藏。

访问级别(private,protected和public),为了方便编程在很多面向对象里都已经实现了(真的是非常方便的语法糖),更抽象地描述和构建系统。

这些可以在一些实现里看出(如已经提到的Python和Ruby)。一方面(在Python中),这些__private _protected属性(通过下划线这个命名规范),从外部不可访问。 另一方面,Python可以通过特殊的规则从外部访问(_ClassName__field_name)。

代码如下:
class A(object):
 
    def __init__(self):
      self.public = 10
      self.__private = 20
 
    def get_private(self):
        return self.__private
 
# outside:
 
a = A() # A的实例
 
print(a.public) # OK, 30
print(a.get_private()) # OK, 20
print(a.__private) # 失败,因为只能在A里可用
 
# 但在Python里,可以通过特殊规则来访问
 
print(a._A__private) # OK, 20

在Ruby里:一方面有能力来定义private和protected的特性,另一方面,也有特殊的方法( 例如instance_variable_get,instance_variable_set,send等)获取封装的数据。

代码如下:
class A
 
  def initialize
    @a = 10
  end
 
  def public_method
    private_method(20)
  end
 
private
 
  def private_method(b)
    return @a + b
  end
 
end
 
a = A.new # 新实例
 
a.public_method # OK, 30
 
a.a # 失败, @a - 是私有的实例变量
 
# "private_method"是私有的,只能在A类里访问
 
a.private_method # 错误
 
# 但是有特殊的元数据方法名,可以获取到数据
 
a.send(:private_method, 20) # OK, 30
a.instance_variable_get(:@a) # OK, 10

最主要的原因是,程序员自己想要获得的封装(请注意,我特别不使用“隐藏”)的数据。 如果这些数据会以某种方式不正确地更改或有任何错误,则全部责任都是程序员,但不是简单的“拼写错误”或“随便改变某些字段”。 但如果这种情况很频繁,那就是很不好的编程习惯和风格 ,因为通常值用公共的API来和对象“交谈”。

重复一下,封装的基本目的是一个从辅助数据的用户中抽象出来,而不是一个防止黑客隐藏数据。 更严重的,封装不是用private修饰数据而达到软件安全的目的。

封装辅助对象(局部),我们用最小的代价、本地化和预测性变化来问为公共接口的行为变化提供可行性,这也正是封装的目的。

Tags:
最新图文资讯
1 2 3 4 5 6
相关文章列表:
易采站长站 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助 -