对象:描述现实中一个事物的属性和功能的程序结构。
对象的底层是关联数组,可用for in 遍历,可以动态添加成员,可以通过.访问。
对象属性的访问:
obj[“key”]:表示固定的,意思是对象里有key 这个属性。如:obj[“age”].等效于obj.key.获取对象里的属性用此方法。
obj[key]:表示动态的。key只是关联数组的下标而已。如果为对象动态添加属性则用次方法。
**封装:**创建一个对象结构来集中保存一个事物的属性和功能。这样便于大量数据的维护和使用
声明对象的三种方式:
1:通过{}创建。
例:var str= {}
2:通过new创建
例:var str = new Object()
3:构造函数
function Str(sname,sage){
this.sname=sname;
this.sage = sage;
this.say=function(){
console.log("aaaaaa")
}
}
用构造函数创建对象的问题:内存浪费。
因为每创建一次对象,就会在内存里创建一个say方法。这完全没有必要,因为函数体内容完全一样。
继承
js里的继承都是通过原型对象实现的。
原型对象是集中存储所有子对象共有成员的父对象。没创建一个构造函数,都会自动创建一个原型对象
function Str(sname,sage){
this.sname=sname;
this.sage = sage;
}
Str.prototype.say=function(){
console.log("aaaaaa")
}
var stu1=new Str('liming','23')
console.log(stu1)
修改一个子对象的原型对象:
stu1.__proto__=father
(不推荐)
Object.setPrototypeOf(stu1,father)
(推荐)
修改构造函数的原型对象:
构造函数.prototype=father(在创建子对象之前)
类型
js中能new的都是一种类型。如:Function,Array,String,RegExp,
类型包括两部分:
1:构造函数,专门用于创建该类型的子对象。
2:原型对象:专门保存该类型子对象的共有成员,
构造函数里的protototype属性指向原型对象。
原型对象里的constructor属性指向构造函数
原型链
判断一个对象是不是数组:
typeof()不行。因为typeof只能判断原始类型和Function
1:arr1.protoArray.prototype(不常用) Array.prototype.isPrototypeOf(arr1)
(推荐)
2:arr1.constructorArray(不常用)
arr1 instanceof Array(推荐)
3:Object.prototype.toString.call(arr1)(最严谨)
4:Array.isArray(arr1)
例:
//创建对象obj
var obj = {
name:"jack",
age:"23"
}
//obj的实质是对象类型。因为每个类型被创建时,都有一个class属性,就像DNA。
obj.__proto__=Array.prototype
console.log(obj instanceof Array)//结果是true。说明此方法不够严谨。
console.log(Array.prototype.isPrototypeOf(obj))//结果是true。说明此方法不够严谨。
console.log(Object.prototype.toString.call(obj))//结果:[Object,Object].此方法最严谨。
console.log(Array.isArray(obj))//原理同方法三
静态方法:不需要创建子对象,用构造函数调用的方法,如:isArray()。静态方法任何类型的数据都可调用。
实例方法:必须创建该类型的子对象,通过子对象才能调用的方法。实例方法只有该类型的实例可调用