JavaScript基于面向对象的理解
2011-08-08 17:51
344 查看
JavaScript是基于对象的,任何元素都可以看成对象。然而,类型和对象是不同的。本文中,我们除了讨论类型和对象的一些特点之外,更重要的是研究如何写出好的并且利于重用的类型。毕竟,JavaScript这种流行的脚本语言如果能够进行良好的封装,并形成一个庞大的类型库,对于重用是非常有意义的。
网上对于prototype的文章很多,一直没明白核心的思想。最后写了很多例子代码后才明白:prototype只能用在类型上。
以下是一些关于类型和对象的例子,大家看完例子后可能更容易理解类型和对象之间的联系:
以上例子中,关于通过类型实现重用方面,重要的有:
·例子1:JavaScript中允许添加行为的类型
·例子2:prototype使用的限制
·例子3:如何定义类型上的静态成员
·例子7:prototype在重定义类型的成员上的限制
·例子10:如何让一个类型继承于另一个类型
·例子11:如何在子类中重新定义父类的成员
可见JavaScript能够实现的面向对象的特征有:
·公有属性(public field)
·公有方法(public Method)
·私有属性(private field)
·私有方法(private field)
·方法重载(method overload)
·构造函数(constructor)
·事件(event)
·单一继承(single inherit)
·子类重写父类的属性或方法(override)
·静态属性或方法(static member)
网上对于prototype的文章很多,一直没明白核心的思想。最后写了很多例子代码后才明白:prototype只能用在类型上。
以下是一些关于类型和对象的例子,大家看完例子后可能更容易理解类型和对象之间的联系:
| [align=center]例子代码[/align] | [align=center]说明[/align] |
1 | Object.prototype.Property = 1; Object.prototype.Method = function () [align=left]{[/align] [align=left] alert(1);[/align] [align=left]}[/align] [align=left] [/align] [align=left]var obj = new Object();[/align] [align=left]alert(obj.Property);[/align] [align=left]obj.Method();[/align] | 可以在类型上使用proptotype来为类型添加行为。这些行为只能在类型的实例上体现。 JS中允许的类型有Array, Boolean, Date, Enumerator, Error, Function, Number, Object, RegExp, String |
2 | var obj = new Object(); obj.prototype.Property = 1; //Error [align=left]//Error[/align] [align=left]obj.prototype.Method = function()[/align] [align=left]{[/align] [align=left] alert(1);[/align] [align=left]}[/align] | [align=left]在实例上不能使用prototype,否则发生编译错误[/align] |
[align=left]3[/align] | [align=left]Object.Property = 1;[/align] [align=left]Object.Method = function()[/align] [align=left]{[/align] [align=left] alert(1);[/align] [align=left]}[/align] [align=left] [/align] [align=left]alert(Object.Property);[/align] [align=left]Object.Method();[/align] | [align=left]可以为类型定义“静态”的属性和方法,直接在类型上调用即可[/align] |
[align=left]4[/align] | [align=left]Object.Property = 1;[/align] [align=left]Object.Method = function()[/align] [align=left]{[/align] [align=left] alert(1);[/align] [align=left]}[/align] [align=left]var obj = new Object();[/align] [align=left]alert(obj.Property); //Error[/align] [align=left]obj.Method(); //Error[/align] | [align=left]实例不能调用类型的静态属性或方法,否则发生对象未定义的错误。[/align] |
[align=left]5[/align] | [align=left]function Aclass()[/align] [align=left]{[/align] [align=left]this.Property = 1;[/align] [align=left]this.Method = function()[/align] [align=left]{[/align] [align=left] alert(1);[/align] [align=left]}[/align] [align=left]}[/align] [align=left]var obj = new Aclass();[/align] [align=left]alert(obj.Property);[/align] [align=left]obj.Method();[/align] | [align=left]这个例子演示了通常的在JavaScript中定义一个类型的方法[/align] |
[align=left]6[/align] | [align=left]function Aclass()[/align] [align=left]{[/align] [align=left]this.Property = 1;[/align] [align=left]this.Method = function()[/align] [align=left]{[/align] [align=left] alert(1);[/align] [align=left]}[/align] [align=left]}[/align] [align=left]Aclass.prototype.Property2 = 2;[/align] [align=left]Aclass.prototype.Method2 = function[/align] [align=left]{[/align] [align=left] alert(2);[/align] [align=left]}[/align] [align=left]var obj = new Aclass();[/align] [align=left]alert(obj.Property2);[/align] [align=left]obj.Method2();[/align] | [align=left]可以在外部使用prototype为自定义的类型添加属性和方法。[/align] |
[align=left]7[/align] | [align=left]function Aclass()[/align] [align=left]{[/align] [align=left]this.Property = 1;[/align] [align=left]this.Method = function()[/align] [align=left]{[/align] [align=left] alert(1);[/align] [align=left]}[/align] [align=left]}[/align] [align=left]Aclass.prototype.Property = 2;[/align] [align=left]Aclass.prototype.Method = function[/align] [align=left]{[/align] [align=left] alert(2);[/align] [align=left]}[/align] [align=left]var obj = new Aclass();[/align] [align=left]alert(obj.Property);[/align] [align=left]obj.Method();[/align] | [align=left]在外部不能通过prototype改变自定义类型的属性或方法。[/align] [align=left]该例子可以看到:调用的属性和方法仍是最初定义的结果。[/align] |
[align=left]8[/align] | [align=left]function Aclass()[/align] [align=left]{[/align] [align=left]this.Property = 1;[/align] [align=left]this.Method = function()[/align] [align=left]{[/align] [align=left] alert(1);[/align] [align=left]}[/align] [align=left]}[/align] [align=left]var obj = new Aclass();[/align] [align=left]obj.Property = 2;[/align] [align=left]obj.Method = function()[/align] [align=left]{[/align] [align=left] alert(2);[/align] [align=left]}[/align] [align=left]alert(obj.Property);[/align] [align=left]obj.Method();[/align] | [align=left]可以在对象上改变属性。(这个是肯定的)[/align] [align=left]也可以在对象上改变方法。(和普遍的面向对象的概念不同)[/align] |
[align=left]9[/align] | [align=left]function Aclass()[/align] [align=left]{[/align] [align=left]this.Property = 1;[/align] [align=left]this.Method = function()[/align] [align=left]{[/align] [align=left] alert(1);[/align] [align=left]}[/align] [align=left]}[/align] [align=left]var obj = new Aclass();[/align] [align=left]obj.Property2 = 2;[/align] [align=left]obj.Method2 = function()[/align] [align=left]{[/align] [align=left] alert(2);[/align] [align=left]}[/align] [align=left]alert(obj.Property2);[/align] [align=left]obj.Method2();[/align] | [align=left]可以在对象上增加属性或方法[/align] |
[align=left]10[/align] | [align=left]function AClass()[/align] [align=left]{[/align] [align=left] this.Property = 1;[/align] [align=left] this.Method = function()[/align] [align=left] {[/align] [align=left] alert(1);[/align] [align=left] }[/align] [align=left]}[/align] [align=left] [/align] [align=left]function AClass2()[/align] [align=left]{[/align] [align=left] this.Property2 = 2;[/align] [align=left] this.Method2 = function()[/align] [align=left] {[/align] [align=left] alert(2);[/align] [align=left] }[/align] [align=left]}[/align] [align=left]AClass2.prototype = new AClass();[/align] [align=left] [/align] [align=left]var obj = new AClass2();[/align] [align=left]alert(obj.Property);[/align] [align=left]obj.Method();[/align] [align=left]alert(obj.Property2);[/align] [align=left]obj.Method2();[/align] | [align=left]这个例子说明了一个类型如何从另一个类型继承。[/align] |
[align=left]11[/align] | [align=left]function AClass()[/align] [align=left]{[/align] [align=left] this.Property = 1;[/align] [align=left] this.Method = function()[/align] [align=left] {[/align] [align=left] alert(1);[/align] [align=left] }[/align] [align=left]}[/align] [align=left] [/align] [align=left]function AClass2()[/align] [align=left]{[/align] [align=left] this.Property2 = 2;[/align] [align=left] this.Method2 = function()[/align] [align=left] {[/align] [align=left] alert(2);[/align] [align=left] }[/align] [align=left]}[/align] [align=left]AClass2.prototype = new AClass();[/align] [align=left]AClass2.prototype.Property = 3;[/align] [align=left]AClass2.prototype.Method = function()[/align] [align=left]{[/align] [align=left] alert(4);[/align] [align=left]}[/align] [align=left]var obj = new AClass2();[/align] [align=left]alert(obj.Property);[/align] [align=left]obj.Method();[/align] | [align=left]这个例子说明了子类如何重写父类的属性或方法。[/align] |
以上例子中,关于通过类型实现重用方面,重要的有:
·例子1:JavaScript中允许添加行为的类型
·例子2:prototype使用的限制
·例子3:如何定义类型上的静态成员
·例子7:prototype在重定义类型的成员上的限制
·例子10:如何让一个类型继承于另一个类型
·例子11:如何在子类中重新定义父类的成员
可见JavaScript能够实现的面向对象的特征有:
·公有属性(public field)
·公有方法(public Method)
·私有属性(private field)
·私有方法(private field)
·方法重载(method overload)
·构造函数(constructor)
·事件(event)
·单一继承(single inherit)
·子类重写父类的属性或方法(override)
·静态属性或方法(static member)
相关文章推荐
- 深刻理解JavaScript基于原型的面向对象
- JavaScript面向对象及原型的理解及笔记整理【一】
- 全面理解面向对象的 JavaScript(来自ibm)
- Javascript面向对象之:原型(prototype)和基于原型的对象系统
- 全面理解面向对象的 JavaScript
- Javascript高级程序设计——面向对象之理解对象
- js开发: JavaScript 中的面向对象的初步理解
- JavaScript面向对象-基于函数伪造的方式实现继承
- 全面理解面向对象的 JavaScript
- JavaScript面向对象——深入理解默认的继承方式原型链
- 全面理解面向对象的 JavaScript
- 轻松学习JavaScript十二:JavaScript基于面向对象之创建对象(一)
- 全面理解面向对象的 JavaScript
- 详解JavaScript基于面向对象之创建对象(2)
- 对基于javascript的回调函数的理解
- 全面理解Javascript的面向对象(二)--创建对象与继承
- JavaScript与as 1.0 基于面向对象的代码演示:
- 什么是面向对象的javaScript(一)——理解面向对象
- 全面理解面向对象的 JavaScript
- 理解JavaScript面向对象的思路