JavaScript 之 对象 (一)

一、对象是个啥

对象是JavaScript的基本数据类型。对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字来访问这些值。除了字符串、数字、false、true、null和undefined之外,javascript中的值都是对象。


首先对象是可变的(原始值是不可变的),他们的值可以进行修改,怎么比较两个对象是否相等?即使两个对象包含同样的属性和属性值,他们也是不相等的。各个索引元素完全相等的两个数组也是不相等的。请看下面的代码

var a = [1,2,3];
var b = [1,2,3];
console.log(a==b)  //false

var aa = [];
var bb = [];
console.log(aa==bb) //false    

通常我们将对象称为引用类型,以此来和javascript的基本数据类型区分开来,按照术语的叫法,对象值都是引用,对象的比较均是引用的比较;当且仅当它们引用同一个基对象时,它们才相等。请看下面代码

var aaa = [];
var bbb = aaa;
bbb[0] = 1;
console.log(aaa) //[1]
console.log(aaa===bbb) //true

那么如何得到一个对象或数组的副本(目的是修改副本却不想修改被复制的对象或数组),则必须显式复制对象的每一个属性或数组的每一个元素,请看下面代码

var es = ['a','b','c'];
var ea = [];
for(var i=0;i<a.length;i++){
  ea[i] = es[i]
}
console.log(ea); //["a", "b", "c"]
ea[0] = 'Q';
console.log(ea); //["Q", "b", "c"]
console.log(es); //["a", "b", "c"]

对象最常见的用法就是创建、设置、查找、删除、检测和枚举它的属性。属性包括名字和值,除了名字和值之外,每个属性还有一些与之相关的值,称之‘“属性特性”

  • 可写,表明是否可以设置该属性的值。
  • 可枚举,表明是否可以通过for/in循环返回该属性。
  • 可配置,表明是否可以删除或修改该属性。

下面用术语来对三类javascript对象和两类属性作区分:

  • 内置对象:ECMAscript规范定义的对象或类。例如,数组、函数、日期和正则表达式都是内置对象。
  • 宿主对象:是由javascript解释器所嵌入的宿主环境定义的。
  • 自定义对象:是由运行中的javascript代码创建的对象。
  • 自有属性:是直接在对象中定义的属性。
  • 继承属性:是在对象的原型对象中定义的属性。

二、创建对象

可以通过 对象直接量关键字newobject.create()函数来创建对象。

1 、对象直接量

使用对象直接量最简单的创建对象的方式,请看下面例子:

var empty = {};
var point = {x:1,y:2};

2、通过new创建对象

new运算符创建并初始化一个新对象。关键字new后面跟一个函数调用。这里的函数称作构造函数,构造函数用以初始化一个新创建的对象。请看下面例子:

var o = new Object(); //创建一个空对象,和{}一样
var a = new Array(); //创建一个空数组,和[]一样
var d = new Date(); //创建一个表示当前时间的Date对象
var r = new RegExp("js"); //创建一个RegExp对象

3、原型

中间穿插一下,先说一下原型,这里懒得打字,插一张图

4、Object.create()

Object.create(),其中第一个参数是这个对象的原型。Object.create()提供第二个可选参数,用以对对象的属性进行进一步描述(稍后再补充第二个参数的用法),Object.create()是一个静态函数,请看下面代码:

var o1 = Object.create({x:1,y:2});  //o1继承了属性x和y

可以创建一个普通的空对象

var o3 = Object.create(Object.prototype) //o3和之前的{}和new Object()一样

5、属性的查询与设置

先看例子:

var book = {
   anthor:'aaa',
   name:'bbb',
};
console.log(book.anthor) //aaa
console.log(book["name"]) //bbb

  book.edition = 6;
  book['name'] = 'b';
 

可以通过点(.)或方括号([ ])运算符来获取属性的值和设置属性。但有两点需要注意,第一、[ ]括号里面的表达式必须返回字符串。第二、. 运算符的标识符不能是关键字。

6、继承

待补充~

7、属性访问错误

一、查询一个不存在的属性不会报错,会返回undefind。

二、但如果对象本身都不存在,你再试图去访问一个不存在的对象上面的属性,就肯定会报错。

三、给null和undefined设置属性也会报错

四、有一些属性是只读的,不能重新赋值,有一些对象不允许新增属性,但让人要命的是,这些失败操作竟然都不报错。

未完待续~

猜你喜欢

转载自www.cnblogs.com/xsdds/p/12093178.html