对象 {} 属性和方法的集合
/*
{x:10,y:function(){}}
访问方式 obj.属性或方法 obj["x"] 对象里的属性和方法实际是字符串,[]可访问变量的属性
遍历 for...in
*/
var obj={a:1,b:2,c:3};
for(var i in obj){
console.log(i,obj[i])
}
//访问不存在的属性结果是undefined,调用不存在的方法,结果报错 x is not a function
//删除 delete 对象.属性或方法名
function car(){
//this: 谁调用函数,this指谁
console.log(100)
}
car() //window.car()
function car(c,w){
this.color=c;
this.weight=w;
console.log(this)
}
var x=new car("白色","1.5T");
var y=new car("黑色","1.55T");
//通过new F生成的对象叫做实例,F称为构造函数
//面向对象 实例有独立的特征
//构造函数的返回值:默认返回实例对象,return基本数据类型无效,return引用类型会导致new 无效
//普通函数与构造函数的区别:
/* 函数名:构造函数名首字母通常大写
this:普通函数this通常指window
构造函数的this指new出来的实例
return: 普通函数return的结果作为函数的值
构造函数 return基本数据类型无效,return引用类型会导致new 无效
*/
function Human(color){
this.color=color;
}
//共有方法放在prototype上
Human.prototype.say=function(){
console.log(this.color)
}
var bMan=new Human("黑色");
var yMan=new Human("黄色");
var wMan=new Human("白色");
bMan.say();
wMan.say();
yMan.say();
dom.siblings();
Element.prototype.siblings=function(){
var children=this.parentNode.children;
var arr=[];
for(var i=0;i<children.length;i++){
if(children[i]!=this){
arr.push(children[i])
}
}
return arr;
}
/*
构造函数的原型 Fun.prototype
实例对象的_proto_ obj._proto_
实例对象的_proto_属性,指向了构造函数的原型
实例对象的prototype为undefined({}没有prototype属性)
实例对象的constructor属性,是构造函数
*/
//所有实例共有的方法需要实现共享,prototype() 原型
//prototype:this指向实例
//自身属性: {}存在的属性
// 检测属性是否为对象的自身属性 obj.hasOwnProperty()
//属性和方法的访问方式
/*
先从自身查找属性,若不存在,则沿着_proto_向上一级查找,一直找到Object.prototype
查找过程中存在一条链式结构,成为原型链
对象的_proto_指向构造函数的原型
*/
//闭包:内部函数引用了外部函数的变量或参数,当内部函数在外部函数的外面被调用时产生了闭包,(闭包是一种环境,是产生的一种环境不是声明的)
//特点:变量一直存在于内存中,不能被垃圾回收机制回收 原因:返回值存在一个外层函数中变量的引用
//垃圾回收:没有用的变量或函数(无法访问的)自动被GC回收
//缺陷: 内存泄漏 无法访问的变量无法被回收 大量应用闭包产生内存泄漏