JavaScript对象浅谈

来源:互联网 发布:图像虚化处理算法 编辑:程序博客网 时间:2024/04/29 17:24

    JavaScript这门语言学了很久了,但都是断断续续的,很快就会忘记以前学过的,所以今天决定把其记到博客上来。

    JavaScript对象

    JavaScript的对象定义为“属性的无序集合,每个属性存放一个原始值、对象或函数。这意味着对象是无特定顺序的值的数组。在ECMAScript中,对象由特性(Attribute)构成,特性可以是原始值,也可以是引用值。如果特性存放的是函数,它将被看作对象的方法(Method),否则该特性被看作属性(Property)。 

    对象的废除

    和Java一样,JavaScript中不用的对象会被回收机制自动回收,避免内存浪费

    对象的类型

    在JavaScript中一共有三种对象,内置对象(build-in object),本地对象(native object),宿主对象(host object)

    定义类或对象

    1. 工厂方式    

Function createCar(color, door, mpg) {    var car = new Object();    car.color = "red";    car.door = 4;    car.mpg = 23;    car.showColor = function() {        alert(this.color);    }    return car;}
    定义之后就可以使用如下方式创建对象和访问方法了:

var car1 = createCar("red", 2, 20);var car2 = createCar("black", 4, 20);car2.showColor();
    这里有个问题,即每次通过这种方式创建对象的时候,都会创建一个新对象并且为每一个新的对象都创建一个showColor的方法,但是方法里面的内容却都一样,每创建一个对象就会创建相同的方法函数对象,占用大量内存这样就推出了第二种创建对象的方式。

    2. 原型方式

Function Car(){}Car.prototype.color="red";Car.prototype.doors=4;Car.prototype.mpg=23;Car.prototype.showColor=function(){alert(this.color)};Var oCar1=new Car();Var oCar2=new Car();
    这种方式利用了JavaScript的prototype属性,用空构造函数来设置类名。这样,每次创建出来的对象不会有相同的属性和方法,而是写在对象的prototype里面,不会占用重复内存。其中,Function Car(){}相当于class Car(){},然而这种方式也有一个缺点,即每次新创建出来的对象的值互相通用,例如:

Function Car(){}Car.prototype.color="red";Car.prototype.doors=4;Car.prototype.mpg=23;Car.prototype.drivers=new Array("Mike","Sue");Car.prototype.showColor=function(){alert(this.color)};Var oCar1=new Car();Var oCar2=new Car();oCar1.drivers.push("Matt");alert(oCar1.drivers);    // 输出"Mike,Sue,Matt"alert(oCar2.drivers);    // 输出"Mike,Sue,Matt"

    3. 混合方式

    即用构造方式创建对象所有的非函数属性,用原型的方式定义对象的函数属性(方法)。结果就是所有对象里面的函数都只创建一次。

Function Car(sColor,iDoors,iMpg)  {    this.color= sColor;  this.doors= iDoors;  this.mpg= iMpg;  Car.drivers=new Array("Mike","Sue");}Car.prototype.showColor=function(){alert(this.color)};Var oCar1=new Car("red",4,23);Var oCar2=new Car("blue",3,25);oCar1.drivers.push("Matt");alert(oCar1.drivers);    // 输出"Mike,Sue,Matt"alert(oCar2.drivers);    // 输出"Mike,Sue"


    4. 动态原型方式

function  Animal(name){     this .name  =  name;     if ( typeof  Animal._initialized  ==  'undefined'){        Animal.prototype.introduceSelf  =   function (){            window.alert( " I am a  "   +   this .name + " ! " );        };        Animal._initialized  =   true ;    }}
    这里表示,如果Animal还没有被初始化过,就创建它的属性和一个原型方法。其中_initialized是Animal的全局私有属性(在JavaScript中并不存在私有属性的概念,所有属性都是共用的,但为了区分其与其他属性的不同,固在前边加上”_")



原创粉丝点击