原型指向可以发生改变
实例对象中的原型__proto__指向的是创建这个对象的构造函数中的原型对象prototype
构造函数中的原型对象prototype的指向发生了改变, 实例对象中的原型__proto__指向也会发生改变
构造函数中的原型对象(prototype)和实例对象中的原型对象(__proto__)是相同,
实例对象中的原型对象(__proto__)指向 构造函数中的原型对象(prototype)
console.log(Person.prototype == obj.__proto__);
原型链:是一个关系,实例对象和原型对象之间的关系,关系是通过实例对象的__proto__联系的
实例对象中 __proto__ 指向 原型对象中 prototype
原型对象是一个对象 ,有一个 __proto__ 指向 Object这个构造函数中的原型对象prototype,最终指向null
如果原型的指向发生了改变,但是又需要用原型对象中的方法和属性, 可以将指向发生改变放在最前面,发生改变后,再来添加属性和方法,这样就可以使用了。
面向对象的三大特征:封装,继承,多态
封装:将一个值封装一个变量,将一段代码封装在一个函数中,将多个函数封装在对象中,将多个对象封装在一个js文件中
继承:父级类和子级类之间的继承-----js中没有类,有构造函数,也可以用继承
多态:一个对象有不同的行为,或者同一个行为有不同的对象,产生不同的结果,如果要实现多态,就要先有继承,js可以模拟多态,但是不会去使用,也不会去模拟.
继承:
1.通过修改原型对象的指向实现继承
缺陷:所有的属性都是一样的
2. 借用构造函数实现继承
要继承的构造函数中:构造函数名字.call(当前对象,属性1,属性2,。。)
缺陷:虽然可以实现属性的不同,但是方法不能继承
3. 组合继承:原型对象 + 借用构造函数
既可以实现属性不重复问题,又可以继承方法
尽量使用函数的表达式,因为使用函数的声明在IE8中会有问题
普通函数中this的指向-----window
对象.方法中的this的指向-----当前实例对象
定时器方法中的this的指向-----window
构造函数中的this的指向-----当前的实例对象
原型对象中的this的指向-----当前实例对象
事件中的this的指向------当前事件源