JS改变this指向及工厂、构造函数

本文探讨了如何在JavaScript中改变this的指向,包括使用call(), apply(), 和bind()方法。同时,对比分析了构造函数和工厂函数的差异,指出了它们在创建对象时可能导致的内存浪费问题,并提出了通过原型对象来实现属性和方法分离的解决方案,以优化代码结构。" 50962200,2115065,面向对象分析与设计(C++)课程要点解析,"['C++编程', '面向对象设计', '软件工程', '编程概念']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

改变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由原型对象指向函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值