JavaScript基础学习之-自定义对象(2)

自定义对象

一、定义类或对象
1.工厂方式
创建对象car

 1 var oCar = new Object;
 2 oCar.color = "red";
 3 oCar.doors = 4;
 4 oCar.mpg = 23;
 5 oCar.showColor = function(){
 6    alert(this.corlor);
 7 };
 8
 9 创建多个car
10 function createCar(color, doors, mpg) {
11     var tempcar = new Object;
12     tempcar.color = color;
13     tempcar.doors = doors;
14     tempcar.mpg = mpg;
15     tempcar.showColor = function () {
16         alert(this.color)
17     };
18    return tempcar;
19 }
20
21 var car1 = createCar("red", 4, 23);
22 var car2 = createCar("blue", 3, 25);
23 car1.showColor();    //outputs "red"
24 car2.showColor();    //outputs "blue"

这个例子中,每次调用函数createCar(),都要创建新函数showColor(),意味着每个对象都有自己的showColor()版本,事实上,每个对象都共享了同一个函数。
有些开发者在工厂函数外定义对象的方法,然后通过属性指向该方法,从而避开这个问题。

 1 function showColor(){
 2    alert(this.color);
 3 }
 4 function createCar(color, doors, mpg) {
 5     var tempcar = new Object;
 6     tempcar.color = color;
 7     tempcar.doors = doors;
 8     tempcar.mpg = mpg;
 9     tempcar.showColor = showColor;
10     return tempcar;
11 }
12
13 var car1 = createCar("red", 4, 23);
14 var car2 = createCar("blue", 3, 25);
15 car1.showColor();    //outputs "red"
16 car2.showColor();    //outputs "blue"

从功能上讲,这样解决了重复创建函数对象的问题,但该函数看起来不像对象的方法。所有这些问题引发了开发者定义的构造函数的出现。

2.构造函数方法

 1 function Car(sColor, iDoors, iMpg) {
 2     this.color = sColor;
 3     this.doors = iDoors;
 4     this.mpg = iMpg;
 5     this.showColor = function () {
 6         alert(this.color)
 7     };
 8 }
 9
10 var oCar1 = new Car("red", 4, 23);
11 var oCar2 = new Car("blue", 3, 25);
12 oCar1.showColor();    //outputs "red"
13 oCar2.showColor();    //outputs "blue"

就像工厂函数,构造函数会重复生成函数,为每个对象都创建独立的函数版本。不过,也可以用外部函数重写构造函数,同样,这么做语义上无任何意义。

3.原型方式

 1 function Car(){
 2 }
 3 Car.prototype.color = "red";
 4 Car.prototype.doors= 4;
 5 Car.prototype.mpg= 23;
 6 Car.prototype.showColor = function(){
 7    alert(this.color);
 8 }
 9
10 var oCar1 = new Car();
11 var oCar2 = new Car();

它解决了前面两种方式存在的两个问题。但并不尽人意。首先,这个构造函数没有参数。使用原型方式时,不能通过构造函数传递参数初始化属性的值,这点很令人计厌,但还没完,真正的问题出现在属性指向的是对象,而不是函数时。考虑下面的例子:

 1 function Car(){
 2 }
 3 Car.prototype.color = "red";
 4 Car.prototype.doors= 4;
 5 Car.prototype.mpg= 23;
 6 Car.prototype.drivers = new Array("Mike","Sue");
 7 Car.prototype.showColor = function(){
 8    alert(this.color);
 9 }
10
11 var oCar1 = new Car();
12 var oCar2 = new Car();
13 oCar1.drivers.push("Matt");
14 alert(oCar1.drivers);      //outputs "Mike,Sue,Matt"
15 alert(oCar2.drivers);      //outputs "Mike,Sue,Matt"
16
17 4.混合的构造函数/原型方式
18 function Car(sColor, iDoors, iMpg) {
19     this.color = sColor;
20     this.doors = iDoors;
21     this.mpg = iMpg;
22     this.drivers = new Array("Mike", "Sue");
23 }
24
25 Car.prototype.showColor = function () {
26     alert(this.color);
27 };
28
29 var oCar1 = new Car("red", 4, 23);
30 var oCar2 = new Car("blue", 3, 25);
31
32 oCar1.drivers.push("Matt");
33
34 alert(oCar1.drivers);    //outputs "Mike,Sue,Matt"
35 alert(oCar2.drivers);    //outputs "Mike,Sue"

现在就更像创建一般对象了。所有的非函数属性都有构造函数中创建,意味着又可用构造函数的参数赋予属性默认值了。因为只创建showColor()函数的一个实例,所以没有内存浪费。

5.动态原型方法

 1 function Car(sColor, iDoors, iMpg) {
 2     this.color = sColor;
 3     this.doors = iDoors;
 4     this.mpg = iMpg;
 5     this.drivers = new Array("Mike", "Sue");
 6
 7     if (typeof Car._initialized == "undefined") {
 8
 9         Car.prototype.showColor = function () {
10             alert(this.color);
11         };
12
13         Car._initialized = true;
14     }
15 }
16
17
18 var oCar1 = new Car("red", 4, 23);
19 var oCar2 = new Car("blue", 3, 25);
20
21 oCar1.drivers.push("Matt");
22
23 alert(oCar1.drivers);    //outputs "Mike,Sue,Matt"
24 alert(oCar2.drivers);    //outputs "Mike,Sue"

动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象方法的位置。

6.混合工厂方式
这种方式通常是在不能应用前一种方式时的变通方法。它的目的是创建假构造函数,只返回另一种对象的新实例。

function Car() {
    var tempcar = new Object;
    tempcar.color = "red";
    tempcar.doors = 4;
    tempcar.mpg = 23;
    tempcar.showColor = function () {
        alert(this.color)
    };
   return tempcar;
}

与经典方式不同,这种方式使用new运算符,使它看起来像真正的构造函数。

7.采用哪种方式
   如前所述,目前使用最广泛的是混合的构造函数/原型方式。些外,动态原型方法也很流行,在功能上与前者等价,可以采用这两种方式中的任何一种。

二、修改对象
1.创建新方法
可以用prototype属性为任何已有的类定义新方法,就像处理自己的类一样。
例:

Array.prototype.indexOf = function(vItem){
   for(var i=0;i<this.length;i++){
      if(vItem == this[i]){
         return i;
      }
   }
   retunr -1;
}

最后,如果想给ECMAScript中的每个本地对象添加新方法,必须在Object对象的prototype属性上定义它。

2.重定义已有方法
就像能给自己的类定义新方法一样,也可重定义已有的方法。函数名只是指向函数的指针,因此可以轻易地使它指向其他函数。

 1 Function.prototype.toString = function(){
 2    return "Function code hidden";
 3 }
 4 function sayHi(){
 5    alert("hi");
 6 }
 7 alert(sayHi.toString());      //outputs "Function code hidden"
 8
 9
10
11  
时间: 2024-11-05 13:34:20

JavaScript基础学习之-自定义对象(2)的相关文章

javascript 基础学习整理 二 之 html对象总结,参考W3C

Anchor 对象 更改一个链接的文本.URL 以及 target 使用 focus() 和 blur() 向超链接添加快捷键 Document 对象 使用 document.write() 向输出流写文本 使用 document.write() 向输出流写 HTML 返回当前文档的标题 返回当前文档的 URL 返回当前文档的 referrer 返回下载当前文档的服务器域名 使用 getElementById() 使用 getElementsByName() 打开一个新的文档,添加一些文本,然后

javascript基础学习(五)

javascript之函数 学习要点: 函数的介绍 函数的参数 函数的属性和方法 系统函数 一.函数的介绍 1.函数就是一段javascript代码.可以分为用户自定义函数和系统函数.   如果一个函数是javascript内置的函数,就称为系统函数.如果函数是自己编写的函数,就是自定义函数. 2.在javascript用function来定义一个函数.function 函数名(参数1,参数2,...){<语句块>  return 返回值} (PS:return语句可以省略) 3.函数的嵌套定

javascript基础学习(六)

javascript之对象 学习要点: 对象的属性和方法 对象的原型 一.对象 对象其实就是一种引用类型,而对象的值就是引用对象的实例. 二.创建对象 在javascript中有两种对象,一种是系统内置对象,另一种是用户自己创建的对象. 1.使用构造函数创建内置对象 在javascript中有很多内置的对象,每个内置的对象都有一个构造函数,直接使用构造函数就可以创建并初始化一个对象. 在javascript中可以使用new运算符来调用构造函数创建对象.如:var myObject=new Obj

JavaScript 基础学习(二)

JavaScript 基础学习(二) instanceof方法: var s = "hello"; var i = 8; //typeof 只能判断基本数据类型 alert(typeof(s)); alert(typeof (i)); //对于引用数据类型,用instanceof var s2=new String("hello2") alert(typeof(s2)); alert(s2 instanceof String);//true var n = new

javascript基础学习(八)

javascript之日期对象 学习要点: 日期对象 将日期对象转换为字符串 将日期对象中的日期和时间转换为字符串 日期对象中的日期 日期对象中的时间 设置日期对象中的日期 设置日期对象中的时间 与毫秒相关的方法 一.日期对象 在javascript中并没有日期型的数据类型,但是提供了一个日期对象可以操作日期和时间. 日期对象的创建: new Date(); 二.将日期对象转换为字符串 将日期对象转换为字符串可以使用以下4种方法: date.toString();//将日期对象转换为字符串时,采

javascript基础学习(二)

javascript的数据类型 学习要点: typeof操作符 五种简单数据类型:Undefined.String.Number.Null.Boolean 引用数据类型:数组和对象 一.typeof操作符 typeof操作符用来检测变量的数据类型,操作符可以操作变量也可以操作字面量. 对变量或值运用typeof操作符得到如下值: undefined----如果变量是Undefined类型: boolean-------如果变量是Boolean类型: number-------如果变量是Numbe

[转载] 几张非常有意义的JavaScript基础学习思维图

原文:http://www.w3cfuns.com/forum.php?mod=viewthread&tid=5598364&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1 1.JavaScript 数组 2.JavaScript 函数基础 3.Javascript 运算符 4.JavaScript 流程控制 5.JavaScript 正则表达式 6.JavaScript 字符串函数 7.JavaScript 数据类型

javascript基础学习(十二)

javascript之BOM 学习要点: 屏幕对象 History对象 Location对象 一.屏幕对象 Screen对象是一个由javascript自动创建的对象,该对象的主要作用是描述客户端的显示器的信息. 目前显示器分辨率为800X600或1024X768两种. screen.height:屏幕的高度 screen.width:屏幕的宽度 screen.availHeigh:屏幕的有效高度 screen.availWidth:屏幕的有效宽度 二.History对象 History对象可以

javascript基础学习(三)

javascript之运算符 学习要点: 表达式 运算符:一元运算符,算术运算符,关系运算符,逻辑运算符,*位运算符,赋值运算符 一.表达式 表达式有常量表达式,变量表达式,复合表达式. 二.算术运算符 一元:+(正号).-(负号).++.—— 二元:*./.%.+.- 三.关系运算符 ==.=== ps:等同运算符比相等运算符要求更为严格,等同运算符只有在两个操作数类型相同,并且值也相同的情况下才会返回true. <.<=.>.>= instanceof运算符.       in