JavaScript进阶:this和prototype

一、this
1、this表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window; 如果在函数中使用this,则this指代什么是根据运行时此函数在什么对象上被调用。 我们还可以使用apply和call两个全局方法来改变函数中this的具体指向。

看一个例子:

alert(this == window); //true

再看一个例子:

// 定义一个全局函数
        function foo() {
            console.log(this.color);
        }
        // 定义一个全局变量,等价于window.color = "red";
        var color = "red";
        // 此时函数foo中this指向window对象
        // 这种调用方式和window.foo();是完全等价的
        foo();  // "red"

        // 自定义一个对象,并将此对象的属性foo指向全局函数foo
        var pack = {
            color : "orange",
            foo: foo
        };
        // 此时函数foo中this指向window.pack对象
        pack.foo(); // "orange"

2、(1)全局函数apply和call可以用来改变函数中this的指向

 // 定义一个全局函数
    function foo() {
      console.log(this.color);
    }
    // 定义一个全局变量
    var color = 'red';
    // 自定义一个对象
    var pack = {
      color : 'orange'
    }
    // 等价于window.foo();
    foo.apply(window);  //'red'
    // 此时foo中的this === pack
    foo.apply(pack);    //'orange'call和apply的区别:

call 方法可以参考
call 方法
请参阅
应用于:Function 对象
要求
版本 5.5
调用一个对象的一个方法,以另一个对象替换当前对象。

call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 
参数 
thisObj :可选项。将被用作当前对象的对象。 
arg1, arg2, , argN :可选项。将被传递方法参数序列。 
说明 :call 方法可以用来代替另一个对象调用一个方法。call 方 法可将 一个函数的对象上下文从初始的上下文改变为由 thisObj   指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被  用作 thisObj。

比如:

var color = 'red';
  function foo1(){
    this.color = 'orange';
  }
  function foo2(){
    console.log(this.color);
  }

  foo2();   //"red",this的对象为window
  foo2.call(new foo1);  //"orange"

当有参数时可以看下面这个例子:

function add(a,b){
    console.log(a+b);
  }
  function sub(a,b){
    console.log(a-b);
  }
  add(4,3);
  sub(4,3);
  add.call(sub,4,3);

二、Prototype
prototype对象是实现面向对象的一个重要机制。每个函数也是一个对象,它们对应的类就是function,每个函数对象都具有一个子对象prototype。Prototype 表示了该函数的原型,prototype表示了一个类的属性的集合。当通过new来生成一个类的对象时,prototype对象的属性就会成为实例化对象的属性。

我们在定义函数的时候,函数定义的时候函数本身就会默认有一个prototype的属性,而我们如果用new 运算符来生成一个对象的时候就没有prototype属性。我们来看一个例子,来说明这个

下面以一个例子来介绍prototype的应用,代码如下:

//定义一个空类
function HelloClass(){
}
//对类的prototype对象进行修改,增加方法method
HelloClass.prototype.method=function(){
alert("prototype测试");
}
var obj=new HelloClass(); //创建类HelloClass的实例
obj.method(); //调用obj的method方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值