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

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

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

来源: 易采站长站

3.对象没有描述自己的结构和行为的严格类,对象不需要类
4.对象没有类类但可以可以有原型,他们如果不能响应消息的话可以委托给原型
5.在运行时随时可以改变对象的原型;
6.在基于委托的模型中,改变原型的特点,将影响到与该原型相关的所有对象;
7.在concatenative原型模型中,原型是从其他对象克隆的原始副本,并进一步成为完全独立的副本原件,原型特性的变换不会影响从它克隆的对象
8.如果不能响应消息,它的调用者可以采取额外的措施(例如,改变调度)
9.对象的失败可以不由它们的层次和所属哪个类来决定,而是由当前特性来决定

不过,还有一个模型,我们也应该考虑。

基于动态类

我们认为,在上面例子里展示的区别“类VS原型 ”在这个基于动态类的模型中不是那么重要,(尤其是如果原型链是不变的,为更准确区分,还是有必要考虑一个静态类)。 作为例子,它也可以使用Python或Ruby(或其他类似的语言)。 这些语言都使用基于动态类的范式。 然而,在某些方面,我们是可以看到基于原型实现的某些功能。

在下面例子中,我们可以看到仅仅是基于委托的原型,我们可以放大一个类(原型),从而影响到所有与这个类相关的对象,我们也可以在运行时动态地改变这个对象的类(为委托提供一个新对象)等等。

代码如下:
# Python
 
class A(object):
 
    def __init__(self, a):
        self.a = a
 
    def square(self):
        return self.a * self.a
 
a = A(10) # 创建实例
print(a.a) # 10
 
A.b = 20 # 为类提供一个新属性
print(a.b) # 20 – 可以在"a"实例里访问到
 
a.b = 30 # 创建a自身的属性
print(a.b) # 30
 
del a.b # 删除自身的属性
print(a.b) # 20 - 再次从类里获取(原型)
 
# 就像基于原型的模型
# 可以在运行时改变对象的原型
 
class B(object): # 空类B
    pass
 
b = B() # B的实例
 
b.__class__ = A # 动态改变类(原型)
 
b.a = 10 # 创建新属性
print(b.square()) # 100 - A类的方法这时候可用
 
# 可以显示删除类上的引用
del A
del B
 
# 但对象依然有隐式的引用,并且这些方法依然可用
print(b.square()) # 100
 
# 但这时候不能再改变类了
# 这是实现的特性
b.__class__ = dict # error

Ruby中的实现也是类似的:也使用了完全动态的类(顺便说一下在当前版本的Python中,与Ruby和ECMAScript的对比,放大类(原型)不行的),我们可以彻底改变对象(或类)的特性(在类上添加方法/属性,而这些变化会影响已经存在的对象),但是,它不能的动态改变一个对象的类。

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