JavaScript权威指南(第六版)-第6章 对象

对象

对象是JavaScript的基本数据结构。对象是一种复合值:他将很多值放在一起,通过名字访问这些值

对象除了保持自有的属性,还可以从一个称为原型的对象继承属性

js对象是动态的——可以增属性也可以删除属性——常用来模拟对象及静态类型语言中的结构体

对象常用的用法:创建create,设置(set),查找(query),删除(delete),检测(test),枚举(enumerate)

每个对象有三个对象特性:对象的原型(prototype),类(class),扩展标记(extensible flag)

一.创建对象

1.定义:通过对象直接量,关键字new Object.create()函数创建

2.对象直接量:创建对象最简单的方式就在js中使用对象直接量

通过new创建

var o = new Object();
var a = new Array();
var d = new Date();
var r = new RegExp();

3.原型

原型对象都是普通对象,普通对象都是具有原型

Object.cteate()的方法创建新对象

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

通过原型继承创建新对象

<script type="text/javascript">
    // 返回一个继承自原型对象proto的属性的新对象
    // 这里可以用到ES5的Object.create()函数
    function inherit(proto) {//proto是一个对象,但不能是null
        if(proto == null) throw TypeError();//proto是一个对象但不能是null
        if(Object.create) return Object.create(proto); //如果Object.create()存在,使用它
        var t = typeof proto; //否则进一步检查
        if(t!=='object' && t!=='function') throw TypeError();
        var F = function() {}; // 定义一个空构造函数
        F.prototype = proto; // 将其原型属性设置为proto
        return new F(); // 使用F()创建proto的继承对象
    }
</script>

二.属性的查询&设置

1.

var author = book.author;//得到book的“author”属性
var title = book["main title"]//得到book的“main title”属性

和 查询属性值的写法一样,通过点和方括号来创建属性或属性赋值,但是在赋值表达式的左侧

book.edition = 6;
book["main title"] = "ECMAScript";

2.作为关联数组的对象

object.property  等效  object["property"]

3.语言有三类:强类型(为所有变量指定数据类型),弱类型(检查的弱,仅能严格区分指令和数据),无类型(不检查 不区分指令和数据)

4.继承

js对象有“自有属性”,也有一些属性是从原型对象继承的

js中只有在查询属性时才会体会到继承的存在,而设置属性则与继承无关,可以有选择地覆盖继承的属性

var unitcircle = { r:1 };//一个用来继承的对象
var  c = inherit(unitcircle);//c继承r的属性
c.x =1;c.y =1;//c定义2个属性
c.r = 2;//c覆盖继承来的属性
console.log(unitcircle.r);//=1原型对象没有修改

5.属性访问错误

三.删除属性

1.delete可以删除对象的属性

delete book.author;
delete book["main title"];

delete只能删除自有属性,不能删除继承属性,不能删除那些可配置性为false的属性。

如:通过变量声明和函数声明创建的全局对象的属性,是不可配置的

严格的,delete后有一个分发的操作数(x),会报一个语法错误,因此必须显示指定对象及其属性

delete x;//在严格模式下报语法错误
delete this.x;//正常工作

四.检测属性

1.可以通过in运算符、hasOwnPreperty()和propertyIsEnumerable()方法来完成 判断某个属性是否存在于某个对象

in的左侧是属性名(字符串),右侧是对象。若对象的自有属性或继承属性包含这个属性则返回true

hasOwnPreperty()方法对给定的名字是否是对象的自有属性进行检测,对于继承属性返回false

除了使用in运算符外,另一种判断一个属性是否是undefined的方法“!==”

<script type="text/javascript">
    var o = {x:1};
    o.x !== undefined;//true o中 有x属性
    o.y !== undefined; //false o中没有y属性
    o.string !== undefined;//true o继承tostring属性
</script>

有一种情况只能用in不能用上述属性访问的方式。in可以区分不存在的属性和存在但值为undefined的属性

<script type="text/javascript">
    var o = {x:undefined};//属性被显式赋值为undefined
    o.x !== undefined;//false o中 有x属性但是值为undefined
    o.y !== undefined; //false o中没有y属性
    "x" in o;//true 属性存在
    "y" in o;//false 属性不存在
    delete o.x;//删除属性x
    "x" in o;//false 属性不再存在
</script>

2."!==”可以区分undefined和null,有时候不用区分

若o中有属性x,且x值不为null或undefined,o.x乘以2,if(o.x != null) o.x *= 2;

若o中有属性x,且x的值不能转换为false,o.x乘以2

若x是undefined、null、false、“ ”、0或NaN,则他不变,if(o.x) o.x *= 2;

五.枚举属性

1.for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性),把属性名赋值给循环变量。

2.对象继承的内置方法不可枚举的,但在代码中给对象添加的属性都是可枚举的。

3.定义一些有用的工具函数来操控对象的属性,这些函数用到for/in循环。extend()函数经常出现在js实用工具库中

(用来枚举属性的对象工具函数)

    

-----------------------------------------

   

-------------------------------------------

   

---------------------------------

除了for/in外还定义Object.keys()和Object.getOwnPropertyNames()用以枚举属性名称的函数

Object.keys(),来返回一个数组,这个数组由对象中可枚举的自有属性组成(与key()原理类似)

Object.getOwnPropertyNames()和Object.keys()类似,只是他返回对象的所有自有属性的名称,不仅是可枚举的属性。

六.属性getter和setter

1.getter和setter定义的属性称为“存取器属性”,他不同于数据属性(数据属性可有一个值有可写性)

同时又getter和setter则他是一个读/写属性。

若他只是getter,则他是一个只读属性

若他只是setter,则他是一个只写属性,读取只写属性总返回undefined

get和set使用的时候注意

getter和setter中this是关键字

七.属性的特性

1.数据属性的4个特性:他的值value,可写性writeable,可枚举性enumerable,可配置性configurable

  存取器没有value和writeable,所以只有读取get和写入set

2.调用Object.getOwnPropertyDescriptor()可以获取某个对象特定属性的描述值

八.对象三个属性

1.对象的原型属性用来继承属性的——“o的原型”

isPrototypeOf()函数实现的功能和instanceof运算符类似

2.类属性

对象的类属性是一个字符串,用来表示对象的类型信息

想获取对象的类,调用对象的toString()方法。

classof()函数可以返回传递给他的任意对象的类

自定义的类,没法通过属性来区分对象的类

3.可扩展性

对象的可扩展性用来表示是否可以给对象添加新属性

通过将对象传入Object.esExtensible()来判断该对象是否可扩展。调用Object.preventExtensions()将对象转换为不可扩展

可扩展性目的是将对象锁定,避免外界的干扰

九.序列化对象

1.定义:将对象的状态转换为字符串,也可以将字符串还原为对象

内置函数JSON.stringify()和JSON.parse()用来序列化和还原js对象。这些方法都使用JSON作为数据交换格式

o = {x:1,y:{z:[false,null,""]}};//定义一个对象
s = JSON.stringify(o);
p = JSON.parse(s);//p是s的深拷贝

十.对象方法

1.所有对象都从Object.prototype继承属性

2.toString()方法,没有参数,返回一个表示调用这个方法的对象值得字符串。在需要将对象转换为字符串的时候,js调用

3.toLocaleString()方法,返回一个表示这个对象的本地化字符串

4.toJSON()方法

如Date.toJSON()

5.valueOf()方法

猜你喜欢

转载自blog.csdn.net/weixin_41056807/article/details/82682052