51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

[JavaScript学习]JavaScript简单对象的创建

在上一篇文章中我们介绍了"JavaScript面向对象-原型的重写"。今天将继续学习其他知识:JavaScript简单对象的创建,貌似有点反过来学习了。

600.png

对象是对具有某些特性的具体事物的抽象。编程语言中的对象实际上是对现实世界中对象的抽象和模拟。JavaScript支持对象,其它如C++,Java等高级编程语言都有很强的对象表单和处理能力。在编程世界中,数据和处理数据的方法结合在一起就构成了对象。

JavaScript是一种基于对象(Object-based)的编程语言,气本质是面向对象。在JavaScript中没有类的概念,而是基于原型拷贝(称为原型对象)。

通过函数创建对象

最简单的创建对象的方法是通过函数来创建对象,此时函数称为类模板,它相当于高级编程语言中的类的作用。在定义函数之后,可以使用new关键字和函数名一起创建新的对象,并把它赋值给一个变量,这时定义的函数实际上就是一个构造函数。在第一函数时,使用this关键字来代表将来所创建的对象。下面是一个例子:

function Person(name,age){
  this.name = name; //定义一个Person的属性为name
  this.age = age;   //定义一个Person的属性为age
  this.address = "上海";  
}
//通过函数创建一个对象
var p1 = new Person("张三",20);
alert(p1.name); //    输出名字为:张三
//创建第二个对象
var p2 = new Person("李四",22);
p2.address = "广州";  //修改p2对象的address属性
alert(p2.address);    //输出:广州

在函数内部通过var关键字定义的属性是私有属性,属于局部变量,而不是类的属性。这个属性不能被对象所使用。

function Person(name,age){
  this.name = name; //定义一个Person的属性为name
  this.age = age;   //定义一个Person的属性为age
  var address = "上海"; //私有属性 
}                              
var p1 = new Person("张三",20);
alert(p1.address);  //undefined

我们知道,在类中除了有类的属性之外,还应该有类的方法。如何在类模板中创建类的方法呢?如果要创建共有的方法,可以通过this.fn = function(){}的方式来创建,如果要创建私有的方法,可以通过function fn2(){}的方式来创建。例如:

function Person(name,age){
  this.name = name; //定义一个Person的属性为name
  this.age = age;   //定义一个Person的属性为age
  this.say = function(){  //创建一个公共的类方法
    alert("大家好!");
  };
  function dosomething(){ //创建一个私有的方法
    alert("ok");
  }
} 
var p1 = new Person("张三",20);
alert(p1.name+" 说 "+p1.say());  //输出:张三 说 大家好

使用函数来创建对象的缺点是:当通过类模板来创建了多个对象实例的时候,内存中会存在多个对象属性和方法的拷贝。也就是说,通过Person类创建了对象p1,内存中会有p1对象的name、age属性和say()方法,如果在创建一个对象p2,又会有p2对象的name、age属性和say()方法,创建100个属性就会有100份这样的拷贝,非常占用内存(在高级编程语言中,对象的属性和方法指向的是同一份拷贝)。在后面我们会降到通过原型链的方式来解决这个问题。

通过new()运算符和Object()构造函数来创建对象

我们还可以通过new()运算符来创建对象实例。要创建一个对象,只需要使用new运算符,然后跟上要创建对象的构造函数即可。例如,常用的构造函数包括Object()Array()Date()等等。这些构造函数都是JavaScript的内置函数。new()原宿风返回所创建对象的引用,程序应该把这个引用赋值给某个变量,并通过变量来访问所创建的对象。下面是使用构造函数创建对象的一些例子:

var cat = new Object();
var arr = new Array("a1","a2","a3");

构造函数是一种特殊的函数,它具备了创建对象并初始化对象的功能,正是由于这种构造对象的特性,才把这种类型的特殊函数称为构造函数。JavaScript提供了一个构造空对象的特殊构造函数Object(),可以用它来构造一个空的对象,并通过扩展这个对象来构造需要的对象。使用Object()创建对象时,需要把new运算符的返回值赋值给某个变量,并通过该变量来引用创建的对象。注意,指定给对象的属性隶属于对象,并且不能使用var关键字来声明。使用Object()构造函数来创建对象的一般格式为:

var obj = new Object();

例如构建一个对象的过程为:

var person = new Object();
person.name = "张三";
person.age = 20;
对象的常用操作

我们除了使用对象.属性名称 的方法来调用对象的属性之外,还可以使用**对象["属性名称"]**的方法来调用属性。例如:

function Person(name,age){
  this.name = name; //定义一个Person的属性为name
  this.age = age;   //定义一个Person的属性为age
  this.say = function(){  //创建一个公共的类方法
    alert("大家好!");
  };

} 
var p1 = new Person("张三",20);
alert(p1.name);   //对象.属性名称
alert(p1["age"]); //对象["属性名称"]

我们可以使用for(var 属性 in 对象)的方式来循环获取对象的所有显示声明的属性:

......
for(var a in p1){
  alert(a); //循环获取所有a对象显示声明的属性
}

注意,如果要在循环中获取对象的属性,不能够使用对象.属性名的方式,而应该使用对象[属性名]的方式,例如:

......
for(var a in p1){
  alert(a + ":" +p1.a);   //该方式获取的p1.a的值为undefined
  alert(a + ":" + p1[a])  //正确获取属性的方式 
}

下面是类和对象中一些有用的方法。

  • instanceof:判断一个对象是不是某种类型。

  • constructor:返回对象的构造函数。

  • prototype:获取类的prototype对象。

  • propertyIsEnumerable(property):是否是可枚举的属性。

  • hasOwnProperty(property):是否属于本类定义的属性。

  • isPrototypeOf(Object):是否是指定类的prototype。

  • toString():返回对象对应的字符串。

  • valueOf():返回对象对应的原始类型值。

关于这些方法在后面介绍对象原型的时候还会详细介绍。

最后提一点是JavaScript中提供了一种主动释放内存的方法:delete 对象名称.属性

返回javascript教程主目录>>


赞(0)
未经允许不得转载:工具盒子 » [JavaScript学习]JavaScript简单对象的创建