JavaScript中对象分为:本地对象(native object)、内置对象(built-in object)、宿主对象(host object)。
1.1、本地对象(native object)
定义为:独立于宿主环境的ECMAScript实现的对象。
这里简单说一下JavaScript的应用环境,JavaScript的应用环境由宿主环境和运行期环境构成。宿主环境主要是指外壳程序(shell)和Web浏览器等,运行期环境由JavaScript引擎内建的。
现在来看一下本地对象有哪些:
Object
、Function
、Array
、String
、Number
、Date
、RegExp
、Boolean
、Error
、EvalError
、RangeError
、ReferenceError
、SyntaxError
、TypeError
、URIError
....
1.2、内置对象(built-in object)
定义为:由ECMAScript提供实现的、独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现。 这意味着内置对象都是已经实例化好的,不需要我们再进行实例化了
现在来看一下常见的内置对象有哪些:
Math对象(就是解决数学问题的所有公式。这个在各种编程语言中都有类似的实现)
Global对象(不存在独立的函数,所有的函数都必须是某个对象的方法。在ECMAScript中不存在独立的函数,所有的函数都应该是某个对象的方法。类似于isNaN()、parseInt()、parseFloat()等方法都是Global对象的方法。 而且Global对象的方法还不止这些。)
1.3、宿主对象(host object)
定义为:由ECMAScript实现的宿主环境提供的对象。
可能这样不是很好理解,上面已经说过了宿主环境包括Web浏览器,所以我们可以这样理解,浏览器提供的对象都是宿主对象。 也可以这样理解,因为本地对象是非宿主环境的对象,那么非本地对象就是宿主对象,即所有的BOM对象和DOM对象都是宿主对象。 那么还有一种对象,那就是我们自己定义的对象,也是宿主对象。
最简单的理解:ECMAScript官方未定义的对象都属于宿主对象。
二、JavaScript创建对象
2.1、对象直接量
创建对象最简单的方式就是在JavaScript 代码中使用对象直接量。对象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间 用逗号分隔,整个映射表用花括号括起来。属性名可以使JavaScript标识符也可以是字符串直接量(包括空字符串)。属性的值可以使任意类型的JavaScript 表达式,表达式的值(可以使原始值也可以是对象值)。下面是一些例子:
var empty = {};
var point = {x:0,y:0};
var point2 = {x:point.x,y:point.y};
var book = {
'main title':'javascript',
'sub-title':'the definitive guide',
'for':'all audiences',
'authour':{
firstname:'David',
surname:'Flanagan'
}
};
2.1、通过new 创建对象
new 运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数称作构造函数(constructor),构造函数用以初始化一个新创建的对象。 JavaScript 语言核心中的原始类型都包含内置构造函数。例如:
var o = new Object();//创建一个空对象和{}一样
var a = new Array();
var d = new Date();
var r = new RegExp('/js/ig');
3.1、js原型
我们创建的每个对象都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中,请看示例:
function Person(params) {
}
Person.prototype.name = "Aomd";
Person.prototype.age = "23";
Person.prototype.job = "程序员";
Person.prototype.sayName = function(){
alert(this.name);
}
var Person1 = new Person();
Person1.sayName(); //Aomd
var Person2 = new Person();
Person2.sayName(); //Aomd
console.log(Person1.sayName == Person2.sayName);
三、对象的废除
ECMAScript有无用存储单元收集程序(就像C#的垃圾收集器),意味着不必专门销毁对象来释放内存。当再没有对对象的引用时,该对象就被废除了。运行无用存储单元收集程序时,所有废除的对象都会被销毁。每当函数执行完它的代码,无用存储单元收集程序都会运行,释放所有的局部变量,还有在一些其它不可预知的情况下,无用存储单元收集程序也会运行。
把对象的所有引用都设置为null,可以强制性的废除对象。例如:
var obj=new Object();
// 程序逻辑
obj=null;
当变量obj设置为null后,对第一个创建的对象的引用就不存在了。这意味着下次运行无用存储单元收集程序时,该对象将被销毁。
每用完一个对象后,就将其废除,来释放内存,这是个好习惯。这样还确保不再使用已经不能访问的对象,从而防止程序设计错误的出现。此外,旧的浏览器(如IE)没有完全的无用存储单元收集程序,所以卸载页面时,对象可能不能被正确地销毁。以前IE6就有这样的诟病,当页面被关闭后对象还是没有被释放,所以总是会导致内存溢出的错误。废除对象和它所有的特性是确保内存正确使用的最好方法。