面向对象的目的就是生成对象
生成对象的方式
1、单例模式
2、类的实例
3、工厂模式
4、构造函数 扮演三种角色 普通函数 普通对象 类
构造函数的三个特点: 函数名首字母大写 里面的属性前面要加this 调用的时候要用new
工厂模式,生成的对象必须要返回
构造函数不用return ,构造函数默认return的是this 在构造函数内的this就是实例对象
构造函数如果人为return的不是对象,直接忽略,如果人为return的是对象,就取代this。
工厂模式生成的实例对象的__proto__直接指向object的原型
构造函数生成的实例对象的__proto__指向他父类的原型 ,然后父类的原型上的__proto__指向基类object的原型
每个类和实例之间都是独立的个体,他们之间的属性互不干扰,是不等的,如果实例和实例之间的属性相等,则这个属性必须是父类的原型上的属性,父类原型的属性是继承的,可共享
原型链:
在操作对象.属性 的时候,首先看这个属性是不是私有的,私有的有就直接使用,私有的没有就找公有的
公有的有就使用,没有就通过__proto__找它父类的原型上有没有,直到基类object,如果object没有就是
undefined。这种查找机制叫原型链。
实例的__proto__上的属性
instanceof () 判断对象是不是这个类的实例对象
isPrototypeOf() 判断实例对象是否是父类的原型
getPrototypeOf() 获取实例对象的原型
hasOwnProperty() 判断一个属性是不是自身(私有)的属性
In 判断一个属性是不是这个对象上的不管私有的还是公有的
实例对象的原型就是他父类的原型
this的指向问题
1、函数外的this指向window
2、函数内的this指向行为发生的主体 主体怎么找 跟函数调用有关,看函数前面有没有.,有.就是.前面的对象,没有就是window
3、定时器的this指向window ,自执行函数的this指向window
4、构造函数和原型上的this指向实例对象
改变this的方法
1、提前将this赋值
2、call 、apply 执行是一样的都是将前面函数内的this改成第一个参数,然后执行前面的函数,不同的是第二个参数,apply是一个数组
3、bind 只改变前面函数的this,但是不执行前面的函数,需要加一个()才执行
克隆对象
1、通过for-in 不管公有的还是私有的都克隆成私有的
2、Object.create() 克隆到原型上面
对象继承
1、原型继承 将父类的实例赋值给子类的原型
将父类的私有的和公有的都继承在子类的原型上,成为子类的公有属性
2、call继承 将父类私有的继承子类私有的
3、冒充对象 将父类私有的和公有的继承为子类私有的
4、混合继承 私有的继承为私有的,公有的和私有的再次继承为公有的,call和原型继承的结合
5、组合继承 私有的继承私有的 公有的继承为公有的
6、中间类继承
arguments 不是一个数组,没有array的那些自带的方法,现在我们想arguments有array的那些方法,将arguments的原型执行Array内置类的原型。