版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于原型的 OOP 和基于静态类的方式直接有很多差异。 让基于原型的 OOP 和基于静态类的方式直接有很多差异。 让基于类特性和基将在 JavaScript 里将“类与原型”的重点是静态类和动态原型(sics + classes vs. dynamics + prototypes),确切地说,一个静态类(例如:C + +,JAVA)和他的属下及方法定义的机类与(type)或分类(classification)例如(这里和下面的例子都是伪代码CClassa,b,cC,ab,概论、在进ECMAScriptOOP 技术分析之前, 有必要掌OOP 基本的特征,并ECMAScript 支持包括结构化、面
2、 象、函数式、命令式等多种编程方式,某些情况下还支持面向方面编程;但本文是 面 象编程,所以来给出 ECMAScript 中面 象子类包含了继承链中所有的属性(即使其中的某些属性是子类不需要的子类包含了继承链中所有的属性(即使其中的某些属性是子类不需要的创建类实例,类不能(因为静态模型)来改变其实例的特征(属性或方法了状态 (即在一个C = Class a, b, c, method1, c1a:10,b:20,c:30Cc2a:50,b:60,c:70C2,(也就是属性值层次(分层)D=ClassextendsC=d,e/a,b,c,d,e d1 = a: 10, b: 20, c: 30,
3、 d: 40, e: 50d1.method1() / D.method1 (no) - C.method1 (yes) d1.method5()/D.method5(no)-C.method5(no)-noresult过去了,D的结构是a,b,c,d,e 。然而,方method1,method2是没有基于类的关键让 看看在 JavaScriptOOP模型,也就是 所建议的基于原型的 OOP让 看看在 JavaScriptOOP模型,也就是 所建议的基于原型的 OOP言有直接关系。下面这样的对象可以独立 他们所有的特性(属性,方法)而不需要的object=a:10,b:20,c:30,meth
4、od:fn; object.a; / 10object.c; / 30 object.method5functionobject.d = 40; / 添加新属性 d deleteobject.c; object.a = 100; / 修改属性 / 结果是: object: a: 100, b: 20, d: 40, method: fn, method5: 基于在 ECMAScript 中例(伪代码6. 实例(因为严格的静态模型)除了有该实例所对应类x = a: 10, b: y = a: 40, c: y.Prototypex;x = a: 10, b: y = a: 40, c: y.Pr
5、ototypex;x 是yy.a;40,y.c;50,y.b; / 20 从原型中获取: y.b (no) - y.Prototype.b (yes): delete y.a; / 删除自身的y.a;10z = a: 100, e: y.a; / 100 从原型 z 中获取y.e50,zz.q200y.q个委托的原型() 。 的机制在这里称为发送信息到对象上,如果链。 链也像静态类中分层次的,但是它可以很容易地重新排列,改变层次和结构。x = a: y = b: y.Prototype = z = c: z.Prototype = z.a / z.a/ z.a (no) -/ z.Protot
6、ype.a (no) -/ z.Prototype.Prototype.a (yes): doesNotUnderstand,Ruby 中的 中call;和ECMAScript 中 doesNotUnderstand,Ruby 中的 中call;和ECMAScript 中 var object = ethod :function(name,alert(name,args); if (name = test) return .test() method is return delegatename.apply(this, var delegate = square:function(a) ret
7、urn a * alert(object.square(10); / 100 alert(object.test();/.test()methodishandledConcatenative 老实说,有必要在说句话关于另外一种情况(尽快在 ECMASCript 没有用到):当原型 对象是完全动态可变的(理论上完全可以从一个类型转化到另一个类型在运行时随时可以改变对象的原型在基于委托的模型中,改变原型的特点,将影响到与该原型相关的所有对象对象是完全动态可变的(理论上完全可以从一个类型转化到另一个类型在运行时随时可以改变对象的原型在基于委托的模型中,改变原型的特点,将影响到与该原型相关的所有对象的
8、模型中,这个改变不会改变现有存在的对象行为,而是改变它的原型特性)Duck 类类型(类)无关,而是是否能够相应消息有关(须的)if (object instanceof SomeClass) /因为突变、类型、特性可if(isFunction(object.test)/ECMAScript if object.respond_to?(:test) / Rubyif hasattr(object, test): 基于原型的关不过,还有一个模型, 也应该考虑。认为,在上面例子里展示的区别“类VS 不过,还有一个模型, 也应该考虑。认为,在上面例子里展示的区别“类VS 原型 ”在这个基于动态类的模型
9、中不是那么重或Ruby(或其他类似的语言)。 这些语言都使用基于动态类的范式。 然而,在某些方面,在下面例子中, 可以看到仅仅是基于委托的原型, 可以放大一个类(原型),从而影响到所有与这个类相关的对象, 也可以在运行时动态地改变这个对象的类(为委#class def init (self,a): self.a = adef return self.a * aA(10)(a.a) # A.b20(a.b)#20可以在a实例a.b30a(a.b) # dela.b(a.b) # 20 - 再次从类里获取(原型如果不能响应消息,它的调用者可以采取额外的措施(例如,改变调度classB(object
10、):B bB()classB(object):B bB()Bb. class = A # 动态改变类(原型b.a10(b.square()100AdelA del #但对象依然有隐式(b.square() # b. = dict # 中,与 Ruby 和ECMAScript 的对比,放大类(原型的JavaScript 的文章往往会文这些可能会说“JavaScript 是不同OOP 实现的其它简要介绍一下其它特性和各种 OOP 实现中关于代码重用的方式,也包括 ECMAScript中的OOP实现。原因是,之前出现的关于JavaScript中关于OOP的实现在 ECMAScript 中对象有几种含
11、义的在 ECMAScript 中对象有几种含义的多态性function test.call(a: 10, b: 20); / 10, test.call(a: 100, b: 200); / 100, vara=1; var b = alert(Dtotype.getTime.call(new Date(); / time alert(Dtotype.getTime.call(newString();/TypeError组的.sort排序方法和它的参数多态的排序功能)。顺便说一下,上面的例子也可以被(签名),多个实现”)多态性和 上面提到的 Duck 类型是有关的:即对象的类型和在层次结构中的
12、位置不是关于封装,往往会有错误的看法。本节 一下一些OOP 实现里的语法糖也就是饰符:private,protected 和 public(或者称为对象的级别和 public),为了方便编程在级别和 public),为了方便编程在很多象里都已经实现和 Ruby)。一方面(private _protected 属性(通过下划线这个命名规范),从外部不可class def init (self): self.public = self. private = def get_private(self): returnself. private# aA()A(a.public) # OK, (a.ge
13、t_private()#OK,(a. privateAprivate) # OK, 法(例如d等)获取封装的数据class a = 10def public_method defreturn a + aA.newaA.newa.public_method # OK, a.aaa.private_methoda.send(:private_method, 20) # OK, 30 a.instance_variable_get(:a)#OK,10惯和风格 ,因为通常值用公共的 API 来和对象“交谈”。藏数据。 更严重的,封装不是用 private 修饰数据而达到抽象的语句“HTML是如下内容”
14、innerHTML属性的 封装的概念不仅仅只与 OOP 相关。 例如,它可以是一个简单的功能,只封装了各种计 算,使得其抽象(Math.round( ) 生伪绝对非抽象的实体设置“getter / setter 方法”(我再说一遍,它是错误的):function A() var _a; / private a this.getA=function_getA()return this.setA = function _setA(a) _a = vara=newA(); alert(a._a);/undefined,private alert(a.getA(); / 10致内存增加的原因(和原型定
15、义相比)。 虽然,理论上第一种情况下可以对对象进行优JS 是 的语言对象是完全可他则 )。JavaScript 里,如果还是把封装曲解成为了不让 在某些自动写入某些值 “隐藏”eval函数(S erMonkey1.7 上测试)eval(_a100,a.getA);a.setA,因为_a两个方法的上a.getA(); / / var foo = (function varx=10;/ privatereturn function () pr foo(); / .x = / var foo = (function varx=10;/ privatereturn function () pr foo
16、(); / .x = 相比,这里只是命名规范var _myPrivateData = (function () ECMAScript 不支持多继承(即只有一个对象,可以用来作为一个直接原型),虽然其(erMonkey)使MixinsMixinsMixins)。 ECMA-262-3 规范没有定义“Mixins”的概念,但根据 Mixins 定义以/ helper for Object.extend = function (destination, source) / helper for Object.extend = function (destination, source) for(pr
17、opertyinsource)if destinationproperty = return var X = a: 10, b: var Y = c: 30, d: Object.extend(X, Y); / mix Yo X alert(X.a,X.b,X.c,X.d);10,20,30,40规范里并没有这样的概念,而且不是mix 而是常用的通过新特性去扩展对象。(Ruby 中 mixins 的概念是定义的,mixin 创建了一个包含模块的一个Traitsmixins的概念相似,但它有很多功能(mixins 所以不能包含状态,因为它有可能导致命名 )ECMAScript Traits mi
18、xins 遵在一OOP 中实现的接mixins traits 类似。然而,与mixins traits 相比,接口已经提到已经提到var _delegate foo:functionvar agregate delegate:_delegate, foo: function () return agregate.foo();/delegate.foo agregate.delegate = foo: function () alert(foo from new AOP 作为面向方面的一个功能,可以使用functiondecorators。ECMA-262-3规格没有明确定义的“function decorators”的概念(和 相对,这个词是在function return functio
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度渔船租赁与渔业政策研究服务合同4篇
- 2025年度租赁房屋租赁合同税费缴纳指南4篇
- 2025年文化创意产业合伙人合作协议书模板3篇
- 2025年度专业赛车场车手雇佣合同3篇
- 2025年物产中大金属集团有限公司招聘笔试参考题库含答案解析
- 《廉政风险防控培训课件》
- 2025年贵州遵义金控集团有限公司招聘笔试参考题库含答案解析
- 二零二五年度米面油食品安全风险评估与监控合同4篇
- 2025年消防给排水系统管网优化设计施工合同2篇
- 2025年度重型工业门采购安装合同范本4篇
- 中国华能集团公司风力发电场运行导则(马晋辉20231.1.13)
- 中考语文非连续性文本阅读10篇专项练习及答案
- 2022-2023学年度六年级数学(上册)寒假作业【每日一练】
- 法人不承担责任协议书(3篇)
- 电工工具报价单
- 反歧视程序文件
- 油气藏类型、典型的相图特征和识别实例
- 流体静力学课件
- 顾客忠诚度论文
- 实验室安全检查自查表
- 证券公司绩效考核管理办法
评论
0/150
提交评论