一、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方法