[原]JavaScript 的对象处理

    JavaScript是面向对象的语言,虽然其没有明确的类概念,任何对象属性都是一个实例变量,但通过对原型对象的定义,实例的共享属性、方法也是可以定义的。
    本文档描述是主要是JavaScript中,对象的定义,不涉及内置对象的使用方法。

一、创建对象
1、用构造函数创建对象

function Student (name,age,grade)
{
  this.name = name;
  this.age = age;
  this.grade = grade;
}

做好构造函数后,就相当于创建好一个类,即可使用该类创建实例:

var student1 = new Student("李明",16,3);

实例一旦创建,就可以通过赋予新值来给该实例添加新的属性,例如:

student1.class = 7;

各实例间是不相关的,所以,该属性仅对student1实例有影响,而对其他同类实例无关。
若希望所有实例都增加class属性,则应在构造函数中定义。

{ …
  this.class = class; }

2、创建空实例
实例也可以先创建,然后再添加属性:

var book = new Object();
book.title = "Book1";

当然,属性页可以是另一个实例(类的对象):

book.chapter1 = new Object();
book.chapter1 = { title:"第二章",pages:30 };

※ 注意,这里添加了两个属性。

3、删除属性
使用delete删除指定的属性:

delete book.title;

二、对象的方法
方法其实就是对象调用的JavaScript函数,在构造函数中,通过this关键字表示调用该方法的实例,而把某个函数赋值给一个属性(变量)。
函数是全局对象的一个方法,是全局性的,根据需要可有返回值。

function RectangleArea () //定义函数
{
  return this.width * this.height;
}
function RectangleEnlarger ()
{
  this.width *= 2;
  this.height *= 2;
}
function Rectangle (w,h) //定义构造函数
{
  this.width = w;
  this.height = h;
  this.Area = RectangleArea; //定义方法
  this.Enlarger = RectangleEnlarger;
}
var r = new Rectangle (2,2); //创建实例
var a = r.Area(); //调用方法,有返回值
r.Enlarger(); //调用方法,没有返回值

三、原型对象和继承
如果用构造函数把方法赋给要初始化的对象,那么,类的每个实例都会有一个相同方法属性的副本,占用大量内存,效率很低,所以,JavaScript可使用原型对象。
每个实例都有一个原型对象,而且实例可以继承其原型对象的所有属性。
要为一个实例的类指定原型对象,需要将构造函数的prototype属性设置为适当的对象。此后,当初始化一个新实例时,JavaScript会自动将该对象作为新建实例的原型对象。
使用原型对象需注意:

引用
a、原型对象可以减少每个实例对内存的需求,即使属性是在对象被创建后才添加到原型对象中,实例仍能够继承这些属性;
b、属性的继承只在读取属性值时才发生,在属性值写入时则不会,因为原型对象的属性是被类的所有实例共享的。
c、所以,通常只用原型对象来定义类的属性和类的方法,类的属性就是那些常用的默认值,是共有的、共享的。

四、面向对象的JavaScript
虽然JavaScript没有明确的类概念,任何对象属性都是一个实例变量,但通过原型对象的定义,实例的共享属性、共享方法也是可以定义的。
1、类变量
或称静态变量。是与类自身关联在一起的变量,而不是和类的实例关联。类变量通过类本身来存储,不会被其它同名变量所覆盖。
Number.MAX_VALUE 就是一个类变量

2、类方法
或称静态方法,也是和类关联在一起的,要调用类方法,必须使用类本身,而不能使用该类的实例。
Date.parse() 就是一个类方法,由构造函数来调用。
this对类方法没有意义。要定义一个类方法,只需使适当的函数称为构造函数的一个属性即可。
类的变量、方法都是全局性的。

3、实例方法
使用this类关键字来引用要操作的实例。实例的方法由类的所有实例共享,需要时调用。
定义实例方法,是通过把构造函数的原型对象中一个属性设置为一个函数值来实现的。

※ 注意:对象实例由new关键字创建,构造方法不用返回任何结果。因此,构造函数不要有返回结果的return语句。

在使用new创建实例时,JavaScript就会自动调用对应类的构造函数。
类的实例之间没有任何关系。this关键字一般只在用作对象成员方法的函数中出现,代表某个成员方法执行时,引用该方法的当前实例。

在对象的构造函数中,使用“this.成员名”的形式,就可以为实例增加新的属性或方法。该操作对使用该类的所有实例都有影响,该类的实例都可以使用这些属性和方法。

举例1,定义普通实例的方法:

function Student (name,age,grade)
{…
  this.out = outFunc;
}
function outFunc ()
{
  document.write (this.name + ":" + this.age);
}
var student1 = new Student("李明",18,3);
student1.out();

举例2,对比类和实例的属性、方法:

function Circle (radius) //构造函数,定义类
{
  this.r = radius; //将初始化为实例的属性
  Circle.PI = 3.14159; //类的属性,在构造函数中定义
}
function Circle_area() { return Circle.PI * this.r * this.r; }
new Circle(0);
// 通过把函数赋予构造函数的原型对象,使其成为一个实例的方法
Circle.prototype.Area = Circle_area;

// 比较两个实例,因此是赋给类,定义为类的方法
function Circle_max (a,b)
{
  if (a.r > b.r) return a;
    else return b;
}
Circle.max = Circle_max;

var c = new Circle(1.0);
c.r = 2.2;
var a = c.Area;
var x = Math.exp(Circle.PI);
var d = new Circle(1.2);
var bigger(Circle.max(c,d));

※ 从上面的两个例子可以看到,如果忽略效率问题,由于方法就是函数,而函数是全局的,所以,实例的方法有两种定义方式。一是,把函数赋予给某个实例(类)的属性;二是使用原型对象的方式,只是原型对象会更有效率。
这里也可看到,JavaScript对类和实例并没有很明确的划分。

JavaScript也有很多的内置对象,例如Date、String等,可查询相关的技术文档。

五、废弃对象
创建一个对象后,可以通过该对象完成某些操作,然后把对象的所有引用都设置为null值,以释放所有占用的内存资源,强制性地废弃对象:

var object = new Object();
object = null;
IE 和FF 获取class属性的问题
JavaScript的window.setTimeout()方法
JavaScript 的in 操作符
JavaScript 的 keyCode与键盘对应表
再次理解DOM的节点属性

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/linux/105363.html

(0)
上一篇 2021年8月25日 15:23
下一篇 2021年8月25日 15:23

相关推荐

发表回复

登录后才能评论