javascript中的this和prototype介绍

1、this

js函数中方的this在函数被调用之前是不确定的,this指向的是函数最后被调用的对象,例如:

可以看到,当第一次直接调用test('t1'),此时是window对象调用的,在调用方法之前window对象里没有fn_name属性,但是调用之后却多出来这个属性来;然后是通过obj来调用方法后,在obj方法里也有了这个属性。这就是通过this的作用做到的,它始终指向的是最后调用它的那个对象的。

 

2、prototype

注意:一下只是我个人的见解,需要详细了解prototype的可以看看这两篇文章:

https://blog.csdn.net/qq_42497250/article/details/92845285

https://blog.csdn.net/flyingpig2016/article/details/53048394

 

js中创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象(原型对象),这个对象包含了通过调用该构造函数所创建的对象共享的属性和方法。

当用prototype来为函数添加了新的属性和方法后,这些属性和方法都将给由该函数创建的实例共享使用。

来看看下面的代码:

function test(name)
{
	this.name = name;
	this.print_name = function()
	{
		console.log(this.name);
	}
}

var t1 = new test('t1');
var t2 = new test('t2');

console.log(t1.name === t2.name); //false
console.log(t1.print_name === t2.print_name); //false

这里由test()创建的两个实例,它们是分别从test()复制了一份属性和方法出来,所以用全等判断时是false。

再看看这个:

function test(name)
{
	this.name = name;
}
test.prototype.print_name = function()
{
	console.log( this.name);
}
test.prototype.age = 1;
var t1 = new test('t1');
var t2 = new test('t2');
console.log(t1.age === t2.age); //true
console.log(t1.print_name === t2.print_name); //true

这次两个实例的age属性和print_name()方法不再是复制的副本了,它们访问的是同一个属性和方法。在某个函数会创建很多实例时,如果每个实例又再次复制一个相同方法的副本的话,这显然不科学,通过prototype让多个实例共用一个方法,就可以解决这个问题了。

总结,对于函数创建的实例需要共享使用的属性和方法,我们可以使用prototype来创建,而那些只想让实例自己去改变的属性则应该用this去创建,例如上面的age,如果这个实例代表的是人的话,我们让两个实例共享肯定是不合理的,应该用用this。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值