首页 > 代码库 > 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:在对象的原型对象中定义的属性

面向对象语言的要求

一种面向对象语言需要向开发者提供四种基本能力:

  1. 封装 - 把相关的信息(无论数据或方法)存储在对象中的能力
  2. 聚集 - 把一个对象存储在另一个对象内的能力
  3. 继承 - 由另一个类(或多个类)得来类的属性和方法的能力
  4. 多态 - 编写能以多种方法运行的函数或方法的能力

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对象浅谈