js高级(二)
原型
原型的作用:
1、节省内存空间
2、实现数据共享
构造函数、实例、原型三者之间的关系 (重点)
1、任何函数(不包括箭头函数)都有prototype属性,它本身是一个对象。
2、构造函数也是函数,也有prototype属性,我们称之为原型
3、prototype属性上面的属性和方法可以被实例化对象所继承
4、任何对象都有constructor属性,实例化对象的constructor属性指向构造函数
5、原型也是对象,也有constructor属性,原型constructor属性指向构造函数
6、实例化对象上面有个__proto__属性,他是一个指针,指向构造函数的原型
this指向:
实例化对象调用原型上面的方法,this指向实例化对象
构造函数原型直接调用方法 this指向构造函数原型
除箭头函数外,其他函数this指向调用它的地方
箭头函数this指向声明它的地方
实例化对象的查找规则
先从自身对象上面查找,本身如果没有,在原型上面进行查找,依次向下查找,如果都没有打印undefined或者报错
字面量创建原型:获取不到,地址不一样
function Car(name) {
this.name = name
// this.color = color
}
let car_1 = new Car('小米')
// Car.prototype.size = '10000'
Car.prototype = {
constructor: Car,
color: 'red'
}
// Car.prototype.color = '粉色'
// Object.prototype.color = 'green'
console.log(car_1);
console.log(Car.prototype.constructor);
原型链的最终指向
原型链的最终指向:null (重点)
var car_1 = new Car('小米')
Car.prototype.color = 'red'
console.log(car_1);
// console.log(Car.prototype);
console.log(car_1.__proto__ == Car.prototype);
Object.prototype.name = 'zs'
console.log(car_1.__proto__.__proto__ == Object.prototype);
console.log(car_1.__proto__.__proto__.__proto__); // null