改变this指向:(继承构造函数原型对象中的方法,要放在所有原型对象方法的上面)
函数名.call( ); 第一个参数必须是指定的对象,方法的原参数,挨个放在后面。
函数名.apply( ); 第一个参数:传入该函数this执行的对象,传入什么强制指向什么,第二个参数开始:数组,把放原有的参数放在一个数组中。
函数名.bind( ); bind用法和call()一样,直接运行方法,但bind返回为新的方法,然后重新调用。
// 无参情况下call
function fun(){
console.log(this);
};
fun();
fun.call('call');
// 有参情况下call,
function fun1(a,b){
console.log(this);
};
fun1(2,3);
// call第二个参数开始:将原函数的参数往后顺延一位
fun1.call('call',2,3);
// apply第二个参数开始:数组,把放原有的参数放在一个数组中
fun1.apply('call',[2,3]);
// bind返回新的方法,然后需重新调用 (三种方法)
let c = fun1.bind('call',2,3);
c();
/* fun1.bind('call',2,3)(); */
/* fun1.bind('call')(2,3); */
构造函数与工厂函数:构造函数是系统自动生成对象,存储数值。工厂函数都是手动创建对象来存贮数值。
工厂函数:
function obj(name,age){
// 手动对象
var oob = {};
// 手动属性
oob.name = name;
oob.age = age;
oob.say = function(){
console.log('yayayaya');
};
return oob
}
var zs = obj('张三','30');
var ls = obj('李四','25');
console.log(zs);
console.log(ls);
构造函数:
function fun3(uname,usex,usage) {
this.name = uname;
this.sex = usex;
this.age = usage;
this.hobby = function(){
console.log(`我的姓名是${this.name}性别是${this.sex}年龄是${this.age}`);
}
}
// 构造函数调用时,请使用 new 关键字
let zs = new fun3("张三","男",18);
let ls = new fun3("李四","男",20);
问题:代码繁琐,内存浪费。
解决以上问题可使用原型对象,使用原型实现属性和方法分离(属性写在构造函数体中,方法写在原型对象中)。
prototype由函数指向原型对象,constructor由原型对象指向函数。