javascript面向对象探究

本文探讨了JavaScript中函数定义式和变量式声明的区别,指出它们在执行顺序上的不同,并详细解释了`this`关键字在不同情境下的含义,包括默认指向window对象以及如何通过`call`和`apply`方法改变其指向。
摘要由CSDN通过智能技术生成

​JavaScript虽然名字中有个Java但其实和Java没有什么关系,只不过当时发布的时候,Java比较火热,大约想借一下名气而以,而JavaScript也并非是面向对象的语言,虽然平时我们也可以简单使用一下,实际上很多地方如果去深究我们都会很困惑,本人就深有同惑,近日与朋友就面向对象及一些不解之处进行了一番交流讨论,如下:

function的定义式声明与变量式声明的区别
this在javascript中代表什么

function的定义式声明与变量式声明的区别

function在javascript中有两种声明方式,如下:

//定义式 function say(){}
//变量式 var say = function(){}

这两种方式是等同的吗?答案是否定的。

  • 例1
 <script type="text/javascript">
 var say = function(){
	alert('say--1');
 }
 say();
 var say = function(){
	alert('say--2');
 }
 say();
 </script>
输出:say--1  say--2
  • 例2
 <script type="text/javascript">
 function say(){
	alert('say--1');
 }
 say();
 function say(){
	alert('say--2');
 }
 say();
 </script>
输出:say--2  say--2

变量式声明是按顺序执行的,而定义式的声明,javascript是首先拿出来解释一下,所以例2中第二个定义式声明把第一个给覆盖了

  • 例3
 <script type="text/javascript">
 function say(){
	alert('say--1');
 }
 say();
 </script>
 <script type="text/javascript">
 function say(){
	alert('say--2');
 }
 say();
 </script>
输出:say--1  say--2

这个例子说明其实javascript是解释一段执行一段的,当然这个执行的过程有待进一步深入

this在javascript中代表什么

我想这个问题也是很多同学不解不处,为了搞清楚,我们来个对比,先来看一段java代码:

package com.test;

public class Student{
    private String name;
    
    public Student(String name){
    	this.name=name;
    }
    
    public void say(){
        System.out.println("hello,"+this.name);

    }
    public String getName() {
		return name;
    }
    public void setName(String name) {
		this.name = name;
    }
    public static void main(String[] args) {
		Student stu = new Student("Tom");
		stu.say();
    }
}
当执行stu.say() 的时候,say方里的this就是当前的实例 stu

再来看一段javascript的

  • 例1
 <script type="text/javascript">
	window.name="currWindow";
	function say(){
		alert(this.name);
	}
	say();
 </script>
输出:currWindow

显然this此时代表的是window这个对象,为什么是这样,有人不解,但很好解释,say(); 这种调用方式是一种简写,完整的应该是window.say(); 由此可见这里的this其实和一般的面向对象语言也差不多,也是调用这个方法的对象

  • 例2
<script type="text/javascript">
	window.name="currWindow";
	var stu = {name:"Tom",hello:say};
	function say(){
		alert(this.name);
	}
	stu.hello();
 </script>

输出:Tom

  • 例3
 <script type="text/javascript">
	window.name="currWindow";
	var stu = {name:"Tom",hello:function(){
		alert(this.name);
		say();
	}};
	
	function say(){
		alert(this.name);
	}
	stu.hello();
 </script>

输出:Tom currWindow

是不是对此有些不解,写成这样呢

  • 例4
 <script type="text/javascript">
	window.name="currWindow";
	var stu = {name:"Tom",hello:function(){
		alert(this.name);
		window.say();
	}};
	
	function say(){
		alert(this.name);
	}
	stu.hello();
 </script>

上述说了一通,javascript没特别之处,下面来特别的地方吧,在java语言或者说一般的面向对象语言中,this就是当前的实例对象,这个是不可改变的,而在javascript中确是可以指定当前对象的,这也是它独有的

  • 例5
 <script type="text/javascript">
	window.name="currWindow";
	var stu1 = {name:"Tom1"}
	var stu2 = {name:"Tom2"}
	function say(){
		alert(this.name);
	}
	say.call(stu1);//等同于stu1.say()
	say.call(stu2);//等同于stu2.say()

 </script>

输出:Tom1 Tom2

还可以带参数,另外还有一个apply方法功能和它一样,只是参数签名不一样

  • 例6
<script type="text/javascript">
	window.name="currWindow";
	var stu = {name:"Tom"}
	function say(age,grade){
		alert(this.name+"-"+age+"-"+grade);
	}
	say.call(stu,1,2);//等同于stu.say(1,2)
	say.apply(stu,[10,20]);//等同于stu.say(10,20)
 </script>

输出:Tom-1-2 Tom-10-20

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值