渡一领跑计划:102-Day10
原型、原型链,call/apply
1.原型
a) 原型是祖先;
b) 原型的增删改查
Car.prototype.height = 1400;
Car.prototype.width = 4900;
Car.prototype.name = "BMW";
function Car(color) {
this.color = color
}
var car = new Car("red");
1.增:
Car.prototype.XXX = XXX
# 只能通过上述方法增加,使用下述方法增加,只会在new出的对象上增加属性
car.XXX = XXX
2.删:
delete Car.prototype.XXX
# 同理只能通过上述方法进行删除。
3.改:
Car.prototype.XXX = XXX
# 与上述同理
4.查:
car.XXX
# 可直接在new出的对象上查询
c) 什么时候用原型?
固定不变的属性,无需通过传参来赋值给this的统统加到原型上。如车的宽高等
d) 原型的”_proto_“可手动更换
var obj = {};
Car.__proto__ = obj;
function Car() {
...
}
console.log(Car.__proto__)
>>> {}
2.原型链
原型链如作用域链一样,呈链式,因此被称为原型链
Grand.prototype.lastName = "Gao";
function Grand() {
...
}
var grand = new Grand();
Father.__proto__ = grand;
function Father() {
this.name = "Chuck"
}
var father = new Father();
Son.__proto__ = father;
function Son() {
this.age = 18;
}
var son = new Son();
如上述代码所示,原型链即为爷爷、父亲、儿子的关系,儿子能向爹要东西,也可以向爷爷要东西,但是爹只能跟爷爷要东西,而不能跟儿子要东西。
3.细碎知识点
- 绝大多数对象的最终原型:Object.prototype,由Object.create(null) 创造的对象不继承Object.prototype
- 可计算范围:小数点前后16位
- call, apply均用作改变this指向,唯一的区别在于,传参方式不同,call的第一个参数留给替换this的东西,其他构造函数依次往后推一。apply的第一个参数同样为替换this的东西,但构造函数的参数用数组的方式传入,因此总共有两个参数。