首页 > 代码库 > JavaScript对象浅谈
JavaScript对象浅谈
JavaScript对象
对象
ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值、对象或函数”。严格来说,这意味着对象是无特定顺序的值的数组。
对象是属性和方法的无序集合
对象就是无序属性的集合
尽管 ECMAScript 如此定义对象,但它更通用的定义是基于代码的名词(人、地点或事物)的表示。
在JavaScript中,除了数字、字符串、布尔值、null、undefined这五种原始类型,之外的都是对象,也就是印证了“万物皆对象”的说法。
对象是一种复合值,它将很多值聚合在一起,(这些值可能是原始类型或者其他对象),可以通过属性名访问这些值,而属性名是可以包含空字符串的任意字符串。
JavaScript对象也是一种数据结构,可以使用instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype
属性。
对象的类型:在 ECMAScript 中,所有对象并非同等创建的。
一般来说,可以创建并使用的对象有三种:
1、 本地对象(native object)
ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。简单来说,本地对象就是 ECMA-262 定义的类(引用类型)。
Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError
2、 内置对象(built-in object)
ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。
3、 宿主对象(host object)
即JavaScript解释器所嵌入的宿主环境(比如浏览器)定义的,例如HTMLElement等;
对象属性:
1、 自有属性(own property):直接在对象中定义的属性;
2、 继承属性(inherited property):在对象的原型对象中定义的属性
面向对象语言的要求
一种面向对象语言需要向开发者提供四种基本能力:
- 封装 - 把相关的信息(无论数据或方法)存储在对象中的能力
- 聚集 - 把一个对象存储在另一个对象内的能力
- 继承 - 由另一个类(或多个类)得来类的属性和方法的能力
- 多态 - 编写能以多种方法运行的函数或方法的能力
ECMAScript 支持这些要求,因此可被看做是面向对象的。
JavaScript还是一门基于对象的弱类型语言
基于对象:内置大量对象,只要少量代码可以完成工作
弱类型:对类型要求不严格
对象的构成
在 ECMAScript 中,对象由特性(attribute)构成,特性可以是原始值,也可以是引用值。如果特性存放的是函数,它将被看作对象的方法(method),否则该特性被看作对象的属性(property)。
对象的创建
1.对象直接量(字面量)
对象直接量由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。属性名可以是JavaScript标识符也可以是字符串直接量,也就是说下面两种创建对象obj的写法是完全一样的:
var obj = {x: 1, y: 2};
var obj = {‘x‘: 1, ‘y‘:2};
2.通过new创建对象(构造函数方式)
new运算符后跟随一个函数调用,即构造函数,创建并初始化一个新对象。
var computer=new Object();
computer.size=15.6;
computer.color=‘黑色‘;
computer.price=‘6999¥‘;
computer.brand=‘DELL‘;
computer.open=function () {
console.log(‘砸碎‘);
}
computer.close=function () {
console.log(‘因为关机被砸坏,需要买新机‘);
}
3.Object.create()
ECMAScript5定义了一个名为Object.create()
的方法,它创建一个新对象,其中第一个参数是这个对象的原型对象
对象的构造函数
自定义构造函数
构造函数,本质上也是函数,要用function关键字声明
命名:使用你所想描述的对象的名称来命名,首字母大写(约定俗成的规定)在构造函数中使用this代替对象
function student(number,age,gender,name,level) {
this.number=number;
this.age=age;
this.gender=gender;
this.name=name;
this.level=level;
this.doHomework=function () {
console.log(‘大家好,我是‘+this.level+‘的‘+this.name+‘,一个喜欢开车的‘+gender);
}
this.runOutClass=function () {
console.log(‘逃课是因为喜欢开车‘);
}
}
var stu1=new student(‘20‘,18,‘男人‘,‘k哥‘,‘三年级‘);
stu1.doHomework();
stu1.runOutClass();
console.log(stu1);
this关键字
1、在构造函数内部: this是指代构造函数内部的当前对象
2、在普通函数内部:在函数调用的时候,this指向调用这个函数的对象,谁调用这个函数(方法),函数中的this就是谁
new 关键字
做了哪些事情:
1、创建了一个对象,并且把这个对象存在了this里面
this = new Object();
2、执行构造函数里的代码,为创建的对象添加属性和方法
3、把this返回给调用构造函数的地方
return this;
访问对象的属性
1、通过点的方式:对象.属性
2、通过键的方式:对象[属性对应的名称字符串]
使用for-in格式遍历对象的属性
格式:
for ( var 属性名称 in 要遍历的对象 ) {
你希望要写的代码
}
基本类型和引用类型
基本类型:
数字、字符串、布尔、undefined、null
引用类型:Object
基本和引用类型的区别
1、存储的位置不一样
基本类型是存储在栈上的
引用类型是存储在堆上的
2、发生传参的时候
基本类型是复制一份进入函数参与运算的
引用类型,复制的是存储在栈上的内存地址,这个内存地址是指向堆中的对象的。所以在函数执行的时候,实际上操纵的是同一个对象
基本类型传参,不会改变实参的
引用类型传参,会改变实参
JavaScript对象浅谈