`
sungang_1120
  • 浏览: 322592 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

JavaScript 中的对象

 
阅读更多

面向对象语言需要具备三种基本特征:继承(Inheritance)、多态 (Polymorphism) 、封装(Encapsulation and Aggregation)。和Java 、C++ 等语言一样,ECMAScript 被认为是面向对象的,因为它同时支持这些特征。

var obj = new Object();


该语句创建了一个对象,当构造函数没有参数时,可以省略后面的括号。我们通常是通过对象的引用来进行对象操作,当一个对象的引用为null时, ECMAScript将启动垃圾回收程序删除该对象,释放内存。当一个对象存在多个引用时,需要将所有的引用设置为null来释放该对象所占用的空间。

1 早期绑定和动态绑定

早期绑定是指在对象被实例化之前对象的属性和方法已经被定义,使得编译器或解释器能够提前编译机器码。Java和VB支持这种特性,但ECMAScript 并非强类型,不支持早期绑定。

动态绑定是指编译器或解释器在运行时才知道该对象的具体类型,之前并不会检查,只会判断这些属性和方法是否得到该对象的支持。ECMAScript对所有的变量使用动态绑定。

2 对象类型

2.1 原始对象

ECMA-262 定义不受主机环境影响的ECMAScript支持的任意对象为原始对象,简而言之,原始对象就是ECMA-262定义的引用类型,比较常用的有 Object、Function、String、Boolean、Number、Array、Date。

Array

Array 有许多常用的方法,很多和Java类似,在此不作介绍。需要注意的是,使用push()和pop()两个方法,可以将Array看作一个栈,遵循后进先出规则(LIFO)。使用shift()和push()两个方法,Array对象即可看作是一个队列,遵循后进后出的规则(LILO)。splice()方法非常有用,它轻松的实现了链表的一些基本功能,如删除数据项、插入数据、替换数据。

Date

ECMAScript 中的Date类是基于Java早期版本中的java.util.Date类的,它可以精确表示1970年1月1日(格林威治时间)前后285616年的任意时间。Date是少有的几个重写了toString()和valueOf()方法,并且两个方法并不相同的类。valueOf()通常表示精确到毫秒级的时间,toString()通常返回个性化的时间表示方法,例如相同的时间在不同浏览器下显示的效果可能不一样。

2.2 Build-in对象

Build-in 对象除了具备原始对象的基本特性外,它在 ECMAScript 程序开始运行时就可以使用,因此可以说任何 Build-in 对象就是原始对象。目前 ECMA-262 只定义了两个 Build-in 对象: Global 和 Math 。

Global

在ECMAScript 里,没有函数可以单独存在,所有的函数都必须是某个对象的方法。如isNan()、isFinite()、parseInt()、parseFloat ()、encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent() 等均是Global对象的方法,除此之外,Global对象还包括一些属性。

Math

Math中有许多属性和方法可以用于数学计算,和Java中的比较类似。

2.3 Host 对象

除了原始对象和Build-in对象外,其他对象均是Host对象。所有的BOM和DOM对象均被认为是Host对象。

3 类成员的访问方式

在面向对象语言程序设计中,常见的类成员访问方式有public、protected和private。在ECMAScript中,只有public一种访问方式,对象中所有的属性和方法都是可见的,因此,在程序设计时需要额外注意系统安全性的问题。在没有合理的程序规范之前,程序员在编写 ECMAScript代码时,通常使用一定规范的命名方式来说明该属性或方法是私有的(仅仅是说明而已,实际上还是公有的),例如在名称前后加上下划线,或只在名称前加下划线。另外,在ECMAScript中没有static方法。

4 this关键字

this关键字是ECMAScript中一个非常重要的概念,通常在对象的方法中使用。

function whatFruit() {
alert(
this .color);
}


var table1 = new Object;
table1.fruit
= " apple " ;
table1.whatFruit
= whatFruit;
var table2 = new Object;
table2.fruit
= " pear " ;
table2.whatFruit
= whatFruit;
table1.whatFruit();
// 输出apple
table2.whatFruit(); // 输出pear


当一个变量前面没有对象或this来引用时,ECMAScript认为该变量是一个本地的或全局变量,于是在本地和全局中去搜寻该变量,如果最后仍没有找到,将会在alert中输出null。

5 自定义类和对象

5.1 工厂方法

在ECMAScript中创建工厂方法,返回一个特定类型的对象,以此实现代码的简洁适用。

function createFruit() {
var tempFruit = new Object;
tempFruit.name
= " apple " ;
tempFruit.number
= 5 ;
tempFruit.showName
= function () {
alert(
this .name);
}
;
return tempFruit;
}


var Fruit1 = creatFruit();
var Fruit2 = creatFruit();


在createFruit()中可以加入形参来传入参数的值。随着ECMAScript不断被规范化,这种创建对象的方法已不再流行,一部分原因是语法上的,一部分原因是功能上的,如每个对象的实例都拥有属于自己的showName方法,给内存管理带来一定的开销。

5.2 构造函数

选择一个类名,第一个字母大写,该类名即是构造函数的名称。创建一个构造函数和工厂方法比较类似,不同的是需要使用关键字new来创建对象的引用。使用构造函数的方式来创建对象和使用工厂方法有着相同的弊端。

function Fruit(name, number) {
this .name = name;
this .number = number;
this .showName = function () {
alert(
this .name);
}
;
}


var Fruit1 = new Fruit( " apple " , 5 );
var Fruit2 = new Fruit( " pear " , 3 );


5.3 使用 Prototype

使用prototype属性可以用来创建新的对象,首先需要一个空的构造函数建立类的名称,然后所有的属性和方法都直接分配到prototype属性中。

function Fruit() {
}

Fruit.prototype.name
= " apple " ;
Fruit.prototype.number
= 5 ;
Fruit.prototype.showName
= function () {
alert(
this .name);
}
;

var fruit1 = new Fruit();
var fruit2 = new Fruit();


但是,这样同样存在一些缺点。首先,构造函数中没有参数,给初始化带来一些麻烦,其次,当一个属性指向的是一个对象而非方法时,该对象会被所有的实例所共享,任何一点改动都会影响到其他对象引用的使用。

5.4 混合使用工厂方法和Prototype

这个概念很简单:使用构造函数定义所有除方法外的属性,使用 prototype 定义对象的方法。这样每个方法只会被创建一次,每个对象都能拥有自己对象实例的属性。

function Fruit(name, number) {
this .name = name;
this .number = number;
this .owner = new Array( " Jerry " , " Terry " );
}

Fruit.prototype.showName
= function () {
alert(
this .name);
}
;

var Fruit1 = new Fruit( " apple " , 5 );
var Fruit2 = new Fruit( " pear " , 3 );


5.5 动态 prototype

简单来说,这种方法就是使用了一个标识符来判断 prototype 是否已经被指向某个方法,从而保证这些方法只会被创建并指向一次。

5.6 混合工厂方法

这种方法和经典的工厂方法及构造函数方法在对象方法内存管理上存在同样的问题,一般不建议使用该方法,除了某些特殊情况(XML in JavaScript中有这样的例子)。

6 修改对象

使用prototype对象可以对对象进行修改。除了用户自定义的对象外,ECMAScript原始对象也有prototype属性。直接使用 prototype可以给对象创建新的方法。

Number.prototype.toHexString = function () {
return this .toString( 16 );
}
;
var iNum = 10 ;
alert(iNum.toHexString());
// 输出A


另外,使用prototype可以轻松修改已有的方法,让方法名指向新的方法。需要注意的是,指向新的方法后,原有的方法不再被任何对象使用,将会被垃圾回收器销毁,使得原有方法不再存在。比较安全的解决办法是,建立一个新的引用来保存原有的方法,然后再将原方法覆盖。

比较特殊的是,ECMAScript中创建对象,在对象引用被创建后,可以给对象加入新的方法,并且可以立即在对象的引用中使用。这是ECMAScript的一个特性,但不推荐这样使用,以免带来不必要的麻烦,例如阅读理解、文档资料等。

分享到:
评论

相关推荐

    JavaScript中 对象、数组的使用

    JavaScript中 对象、数组的使用

    2.JAVASCRIPT中对象的层次与继承整理.pdf

    2.JAVASCRIPT中对象的层次与继承整理.pdf

    JavaScript面向对象编程指南.pdf

    JavaScript面向对象编程是指在JavaScript语言中使用面向对象的方法来编写程序。JavaScript是一种高级的、解释型的编程语言,它支持面向对象的编程范式,允许开发者创建对象、使用继承和多态等面向对象的特性。以下是...

    javascript中数组、对象

    在JavaScript中,数组和对象是两种非常基础且重要的数据结构,它们被广泛应用于各种场景,如数据存储、逻辑处理和对象表示。这篇文章将深入探讨这两种数据类型,以及相关的操作和工具。 **一、数组** 数组在...

    深入浅出JavaScript对象模型

    ### 深入浅出JavaScript对象模型 #### JavaScript对象的本质 根据ECMA262规范,ECMAScript被定义为一种基于对象的语言而非传统的面向对象语言。这意味着在JavaScript中,对象被视为存储数据的一种大型数组形式,...

    JavaScript中对象的prototype属性代码实例

    我猜一般用过JavaScript的人都看见过或者用过对象的prototype属性。这是个好东西,它可以向其原型中动态添加功能(属性和方法),但该对象不能被赋予不同的原型。然而,用户定义的对象可以被赋给新的原型。详细介绍:...

    Javascript面向对象编程.

    这篇博客文章可能详细讨论了如何在JavaScript中实现面向对象编程。 在JavaScript中,面向对象主要通过以下三种方式实现: 1. **构造函数(Constructor)**:构造函数是一种特殊的函数,用于创建和初始化对象。我们...

    举例讲解JavaScript中关于对象操作的相关知识

    本文将通过具体的例子,详细讲解JavaScript中关于对象操作的相关知识,帮助初学者更好地理解和使用JavaScript对象。 首先,我们来看数组到对象的转换。数组是一种特殊的对象,通常使用方括号`[]`定义,每个元素都有...

    javascript面向对象快速入门实例.docx

    如果在当前对象中找不到某个属性,JavaScript会查找其原型对象,直到找到该属性或到达原型链的顶端。 另一种创建对象的方式是使用`Object.create()`方法,直接指定原型对象: ```javascript var cat2 = Object....

    JavaScript面向对象编程指南

    面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的...

    JAVASCRIPT 面向对象编程精要

    面向对象编程(OOP)作为一种重要的编程范式,在JavaScript中也有独特的实现方式。 #### 二、JavaScript的特性概述 JavaScript是一种基于原型的语言,这意味着它不像传统的面向对象语言(如Java或C++)那样拥有类的...

    面向对象JavaScript精要(英文原版pdf)

    - **第三章:JavaScript中的类和对象**:详细介绍如何使用JavaScript创建类和对象。 - **第四章:继承**:探讨JavaScript中实现继承的不同方式。 - **第五章:封装和私有性**:讲解如何在JavaScript中实现封装以及...

    JavaScript的面向对象

    JavaScript的面向对象是一种重要的编程范式,它在JavaScript中通过构造函数、原型链以及类(ES6引入)来实现。这篇博文将深入探讨JavaScript中的面向对象特性,包括类的概念、对象的创建、继承机制以及封装。 首先...

    JavaScript内置对象相关介绍及用法

    JavaScript内置对象相关介绍及用法ppt JavaScript内置对象相关介绍及用法

    javascript对象转换成json

    - 如果对象中有循环引用(即一个对象引用了另一个,而另一个又引用了第一个),`JSON.stringify()`会抛出一个错误。 - 当使用`replacer`函数时,可以通过返回undefined来排除某个属性不被包含在JSON字符串中。 ### ...

    JavaScript中对象介绍

    在JavaScript中,对象是一种复合数据类型,它将很多值(原始值如数字、字符串、布尔值等,以及其他对象)聚合在一起,可以通过名称访问这些值。 ### 对象的创建 在JavaScript中,对象可以通过两种主要方式创建: ...

    一文理清 JavaScript 中对象的创建模式与继承模式

    一文理清 JavaScript 中对象的创建模式与继承模式 文章目录一文理清 JavaScript 中对象的创建模式与继承模式一、前言 :1. 写作目的2. 需要具备的知识点3. 阅前声明二、JavaScript 中对象的创建模式1. ( 单例模式 ) ...

    javascript创建对象的方式(二)

    在JavaScript中,创建对象是编程的基本操作之一,它支持多种方式来实现这一目的。这篇博客“javascript创建对象的方式(二)”可能详细介绍了在JavaScript中除了最基础的字面量语法之外的其他创建对象的方法。这里...

    javascript对象的创建和访问_.docx

    首先,让我们了解一下JavaScript对象的本质。对象在JavaScript中本质上是一个键值对的集合,即关联数组,这些键可以是字符串或符号,值则可以是任意数据类型,包括函数和其他对象。这种灵活性使得JavaScript对象能够...

Global site tag (gtag.js) - Google Analytics