【JS】JavaScript对象

对象是JavaScript的基本数据类型,对象是一种复合值,它将很多原始值或者其它对象聚合在一起,可通过名字访问这些值。对象也可看做是属性的无序集合,每个属性都是一个名值对。属性名是字符串,因此我们可以把对象看成是从字符串值到值的映射。JavaScript对象除了可以保持自己的属性,还可以从一个称为原型的对象继承属性,对象的方法通常是继承的属性,这种原型式继承,是JavaScript的核心特征。

除了字符串、数字、true、false、null和undefined之外,JavaScript中的值都是对象,尽管字符串、数字和布尔值不是对象,但它们的行为和不可变对象非常类似。对象最常见的用法是创建create、设置set、查找query、删除delete、检测test和枚举enumerate它的属性。属性都有一些与之相关的值称为属性特性,如可写、可枚举、可配置,每个对象也都有一些与之相关的对象特性,如对象的原型、对象的类和对象的扩展标记。JavaScript对象包括内置对象、宿主对象和自定义对象,属性分自有属性和继承属性。

1、创建对象

对象创建有以下几种方法——
(1)使用对象直接量:
(2)使用new关键字,调用构造函数——

var d = new Date();

(3)使用Object.create()静态函数:

var o = Object.create({x:1, y:2});

每一个 JavaScript对象除null外,都和另一个对象相关联,就是我们熟知的原型,每一个对象都从原型继承属性。所有通过对象直接量创建的对象都具有同一个原型 ,并可以通过JavaScript代码Object.prototype获得对原型对象的引用。通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。没有原型的对象为数不多,Object.prototype就是其中之一,它不继承任何属性。

2、属性访问

属性访问可通过句点.和方括号[]进行,既可以查询属性,也可以设置属性。

3、属性删除

delete运算符可以删除对象的属性,然而只能删除自有属性,不能删除继承属性,也不能删除那些可配置性为false的属性,比如通过变量声明和函数声明创建的全局对象的属性,在严格模式中,删除一个不可配置属性会报一个类型错误,在非严格模式中,delete操作会返回false。

4、属性检测

JavaScript对象可以看做属性的集合,我们经常会检测集合中成员的所属关系,判断某个属性是否存在于某个对象中,可以通过in运算符、hasOwnProperty()和propertyIsEnumerable()方法来完成这个工作。有时候使用”属性值!==undefined”也可判断一个属性的存在,但如果属性值本身等于undefined时,这个方法就不凑效了。

5、枚举属性

枚举属性常用于for/in循环,用来遍历对象中所有可枚举的属性,包括自有属性和继承的属性。ECMAScript5定义了两个用以枚举属性名称的函数,Object.keys()和Object.getOwnPropertyNames(),前者返回一个数组,这个数组由对象中可枚举的自有属性的名称组成,后者类似,只是它返回对象的所有自有属性的名称,而不仅仅是可枚举的属性。

6、存取器属性

存取器属性即getter和setter,是方法,但不使用function关键字,不同于数据属性,它不具有可写性,不过是可以继承的,这点和数据属性相同。下面是一个简单的例子:

var p = {
    x: 1.0,
    y: 1.0get r() {return Math.sprt(this.x * this.x + this.y * this.y);
    },
    set r(newvalue) {
        var oldvalue = Math.sprt(this.x * this.x + this.y * this.y);
        var ratio = newvalue / oldvalue;
        this.x *= ratio;
        this.y *= ratio;
    }
};

7、属性的特性

数据属性的特性有值value、可写性writable、可枚举性enumerable和可配置性configurable,存取器属性有读取get、写入set、可枚举性enumerable和可配置性configurable,这些特性称为属性描述符。通过掉用Object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述符,只能得到自有属性的描述符,要想获得继承属性的特性,需要遍历原型链,调用Object.getPropertyOf()。要想设置属性的特性,或者想让新建属性具有某种特性,则需要调用Object.defineProperty(),如果要同时修改或创建多个属性,则需要使用Object.definePropertys()。

8、原型属性

对象的原型属性是用来继承属性的,要想检测一个对象是否是另一个对象的原型或处于原型链中,使用isPropertyOf()方法。

9、类属性

对象的类属性是一个字符串,用以表示对象的类型信息,要想获得对象的类,可以调用对象的toString()方法,然后提取已返回字符串的第八个到倒数第二个位置之间的字符,不过很多对象继承的toString()方法重写了,为了能正确的调用toString()版本,必须间接地调用Function.call()方法。

10、可扩展性

对象的可扩展性用以表示是否可以给对象添加新属性。通过将对象传入Object.isExtensible(),来判断该对象是否是可扩展的,如果想要将对象转换为不可扩展的,需要调用Object.preventExtensions(),而Object.seal()除了能够设置为不可扩展的,还可以将对象的所有自有属性都设置为不可配置的,可以使用Object.isSealed()来检测对象是否封闭。Object.freeze()将更严格地锁定对象,还可以将它自有的所有数据属性设置为只读,存取器属性setter不受影响,效果可以使用Object.isFrozen()来检测。

11、序列化对象

对象序列化是指将对象的状态转换为字符串,也可将字符串还原为对象,相关函数为JSON.stringify()和JSON.parse(),这些方法都使用JSON作为数据交换格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值