JavaScript中的对象

对象的三个相关特性

1 原型对象

2 对象的类

3 对象的可拓展性

三类Js对象及两类属性

1 内置对象

2 宿主对象

3 自定义对象

4 自有属性

5 继承属性

思考:以上的概念是否清楚?

创建对象的方式

//对象直接量
var a={x:1}
//通过new创建对象,a()是一个函数调用,new a()实际是及创建了一个继承自a()的对象
var a=new a();
//通过Object对象的静态方法
Object.create()

思考1:以上3个方法如何创建空对象?

思考2:我们如何在实现一个静态函数?

经典代码 :通过原型继承创建一个新对象

function inherit(p){
    if(p===null) throw TypeError;
    if(Object.create){
        return Object.create(p);
    }
    var t=typeof p;
    if(t!=='object'&&t!=='function')   throw TypeError;
    function f(){}
    f.prototype=p;
    return new f();
}

查询对象的两种方式:. 及[" "] ,[" "]与for in 循环配合使用,for in 循环的是对象中可枚举的自有属性及继承属性

JavaScript对象都是关联数组,只不过每一项的下标不是数字而是属性名

访问对象属性的一种简写

var len=book && book.subtitle && book.subtitle.length

&&运算符除了返回true,false外,还会返回真假值,当运算符左侧的值为真时,返回值为右侧的值,以此类推

删除属性

delete 属性时需要循环遍历属性中的属性,防止内存泄漏

deiete 不能删除不可配置的属性

检测属性

三个方法

in  //自有属性+继承属性

hasOwnProperty() //自有属性

propertyIsEnumerable() //自有属性+可枚举属性

存储器属性

var p={
    x:1,
    get r()  {return x},
    set r(value)  {this.x=value}
}

属性的特性

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

存储器属性的4个特性:get(读取),set(写入),enumerable(可枚举),configurable(可配置)

获取对象属性特性的方法

Object.getOwnPropertyDescriptor(object,propertyName)

设置对象属性特性的方法

Object.defineProperty(object,propertyName,{
    value: 1,
    writeable: true,
    enumerable: true,
    configurable: true
})
Object.defineProperties(object,{
param1:{
value:,
writeable:,
enumerable:,
configurable:
},
param2...
})

一个经典的继承函数

Object.defineProperty(Object.prototype,'extend',{
    value:function(o){
        var names=Object.getOwnPropertyNames(o);
        for(var i=0;i<names.length;i++){
            if(names[i] in this) continue;
            var desc=Object.getOwnPropertyDescription(o,names[i]);
            Object.defineProperty(this,names[i],desc);
        }
    }
})

检测对象原型的方法

Object.getPrototypeOf()获取一个对象的原型

__proto__属性用于查询/设置对象的原型

查询对象的类

一个经典的方法

function classof(o){
    if(o===null) return 'Null';
    if(o===undefined) return 'Undefined';
    return Object.prototype.toString.call(o).slice(8,-1);
}

对象的可扩展性

三个方法

Object.preventExtensions();//对象不可扩展

Object.seal();//对象不可扩展+属性不可配置

Object.freeze();//对象不可扩展+属性不可配置+只读(不包括存储器属性的setter方法)

对象的序列化

JSON.stringify() //只能序列化对象可枚举的自有属性

猜你喜欢

转载自www.cnblogs.com/goOtter/p/9327942.html