JavaScript 对象概念以及自定义引用类型

在基于对象的编程中,用对象给真实的事物建模,而对象通过其方法和属性来定义。
每个JavaScript对象都有一组相关属性和方法,可用于操作某种数据。例如,Array对象包含可以操作数组的方法,以及可 以检索数组信息的属性。要使用这些方法和属性,需要把数据定义为这些对象中的一个,也即需要创建对象。
在JavaScript中对象数据在变量中的存储方式与基本数据类型(例如文本和数字)不同。基本数据类型是JavaScript中最基本的数据。对于基本数据类型,变量存储数据的实际值。例如:number变量存储了数据23

var number=23;

而赋予对象的变量不存储实际数据,而存储指向保存数据的内存地址的引用。变量引用一个对象时,其含义是变量引用一个内存地址。例如:定义了一个数组对象,并声明一个变量array指向该对象的内存地址的引用

var array=[0,1,2];

创建对象

JavaScript创建对象的方式与其他编程语言很类似,要创建各种类型的对象,可使用new运算符或者字面量符号法。
要创建JavaScript对象,只需要使用new操作符后接Object构造函数即可:

var object=new Object();

var date=new Date();
var string=new String("hello");

JavaScript提供了一个字面量语法来表示对象:一对花括号({ }):

var object={};

创建自定义对象

JavaScript内置了很多功能强大的内置对象,例如Array对象,Date对象,String对象等等。但JavaScript的真正强大之处在于用户可以创建自己的对象来表示复杂的数据。
创建自定义对象首先需要创建一个Object对象,有上面两种创建对象的方法。例如:声明一个person变量来引用自定义对象。

var person=new Object();
var person={};

创建对象后,就可以给对象添加一些属性。这类似于变量的创建,只是不再使用var关键字。仅使用对象的名称,后跟一个句号以及属性的名称,之后,再给该对象赋予值。例如:

person.name="Jason";
person.age=18;

上面两行代码为person对象创建了name和age属性,并分别为它们赋予了值。JavaScript并不会检查这些属性在之前是否就已存在,它只负责创建它们。
person对象中方法定义如下,下面的代码为方法赋值,只是所赋的是一个函数而不是其他类型的值。注意方法内部this的用法,this.name和this.age。在JavaScript中,this是一个指向当前对象的特殊变量。从字面上来讲,它表示“这个对象”。

        person.getMsg=function () {
            document.write("My name is "+this.name+".And age is "+this.age+"<br/> ");
        };

注意在function和()之间没有名称。没有名称的函数称为匿名函数。将匿名函数赋给变量后,该函数的名称就为变量的名称。因此可以执行赋给person.getMsg的匿名函数,如下所示:

person.getMsg();

创建person对象的完整代码如下:

        var person={};
        person.name="Jason";
        person.age=18;
        person.getMsg=function () {
            document.write("My name is "+this.name+".And age is "+this.age+"<br/> ");
        };

使用字面量符号法(literal notation)来定义整个对象,可以将这4条语句缩减为一条语句。

        var person={
            name:"Jason",
            age:18,
            getMsg:function () {
                document.write("My name is "+this.name+".And age is "+this.age+"<br/> ");
            }
        };

注意字面量符号法使用花括号将整个对象置于其中。然后采用属性名称/方法名称后跟一个冒号和值的方式定义了每个属性和方法。在此没有使用等号,在对象的字面量符号法中,是采用冒号来设置属性的值。最后注意用逗号隔开每个属性和方法的定义。

创建对象的新类型(引用类型)

JavaScript提供了大量内置于该语言的对象,供我们使用。也可以创建自定义的对象来表示更复杂的数据,不过JavaScript也支持用户创建自己的对象类型。例如,可以创建表示个人的object对象,但也可以创建表示Person对象的对象。
在上面定义的person变量引用的是一个简单的自定义object对象,仅能创建包含自定义属性和方法的简单对象,并没有创建实际的Person对象。
JavaScript允许根据自己的需求创建特定对象的模板。JavaScript支持引用类型的定义,引用类型实际上是对象的模板。在使用新的对象类型之前,需要先定义对象类型及其方法和属性。一个重要的区别是,在定义引用类型时,不会创建基于该类型的对象。只有使用new关键字创建该引用类型的实例时,才会根据原型(prototype)创建该类型的对象。在Java中,引用类型相当于类,但在JavaScript并不支持正式的类结构,该语言完全支持对应的逻辑,即引用类型。JavaScript内置对象都是引用类型,String,Array,Number,Date和Object都是引用类型,用户创建的对象是这些类型的实例。

引用类型由以下三部分组成:

  • 构造函数
  • 方法定义
  • 属性
  • 前面创建了表示单个人的对象,下面创建一个简单的引用Person,它的作用和前面创建的对象一样,只是这些对象是实际的Person对象。
    首先需要创建构造函数,在构造函数中创建了两个属性并分别进行赋值初始化,如下所示:

            function Person(firstName,lastName) {
                this.firstName=firstName;
                this.lastName=lastName;
            }

    在构造函数中定义的firstName和lastName属性称作实例数据,实例数据对于每个对象或实例都是唯一的。在所有的对象之间不应该共享它们。

    然后定义方法,可以在构造函数中定义,也可以在Person的prototype来定义它们则更高效:

            Person.prototype.getFullName=function () {
                return this.firstName+" "+this.lastName;
            };
            Person.prototype.greet=function (person) {
                document.write("Hello, "+person.getFullName()+" .I'm "+this.getFullName()+"<br/>");
            };

    注意Person.prototype,在JavaScript中函数也是对象,所以函数也包含属性和方法。每个函数对象都包含prototype属性,但该属性仅对构造函数有用。可以将Person.prototype属性看成Person对象的实际原型。赋给Person.prototype的任何属性和方法对于Person对象都可用。所有Person的对象或实例都可以共享赋给Person.prototype.getFullName和Person.prototype.greet的函数,这意味着一个Person对象的getFullName的函数对象与另一个Person对象的getFullName的函数对象是完全一样的,可以使用如下代码来表示:

    var isSame=person1.getFullName==person2.getFullName;//true

    完整地自定义引用类型代码:

            function Person(firstName,lastName) {
                this.firstName=firstName;
                this.lastName=lastName;
            }
            Person.prototype.getFullName=function () {
                return this.firstName+" "+this.lastName;
            };
            Person.prototype.greet=function (person) {
                document.write("Hello, "+person.getFullName()+" .I'm "+this.getFullName()+"<br/>");
            };

    定义完引用类型后就可以创建使用了,创建引用类型的实例与创建JavaScript内置类型的实例一样:使用new关键字。

            var johnDoe=new Person("John","Doe");
            var janeDoe=new Person("Jane","Doe");

    建议定义引用类型来替代自定义的对象,主要区别在于对象的创建方式。与字面量对象相比,构造函数中的对象通常消耗的计算机内存要少一些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值