JavaScript中的面向对象【二】
使用this关键字
this关键字引用的是包含它的函数作为某个对象的方法被调用的那个对象
这句话究竟是什么意思呢?我们通过下面的例子来解释一下:
var MyObject = {};
MyObject.name = 'John';
MyObject.say = function () {
//this关键字引用的是包含它的函数作为某个对象的方法被调用的那个对象
return this.name + '在说话';
};
//此时的this指向了调用say()方法的MyObject对象
alert(MyObject.say());
我们再看下一个例子:
<a href="#" id="a">content</a>
<script>
function ChangeColor(){
this.style.color = 'red';
}
//此时的this指向了调用ChangeColor构造器的document.getElementById('a')对象,即是id为a的这个超链接
document.getElementById('a').onclick = ChangeColor;
//此时的this指向了调用ChangeColor构造器的window对象,可是window对象没有style.color这个属性,所以报错
ChangeColor()
</script>
构造器函数
还有一个创建对象的方式:通过构造器函数。
让我们看看一个例子:
//定义一个构造器函数
function MyConstructor() {
this.name = 'John';
this.age = 19;
}
为了能访问这个构造器函数里的属性,你可以使用new操作符。
像这样:
//实例化一个对象,用new关键字
var myCon = new MyConstructor();
//访问对象的元素
alert(myCon.name);
访问这个对象的方法、对象等等与我们“JavaScript中的面向对象【一】”提到的访问方式一样的。
构造器属性
当一个对象创建的时候,一个特殊的属性自动分配给了它——构造器(constructor)属性。
让我们看一下下面的例子:
//创建对象时自动分配的constructor属性
document.write(myCon.constructor);
document.write(typeof myCon.constructor);
//它包含一个创建这个对象的构造器函数的引用,调用这个函数来创建一个新的对象
//换句话说:我不关心对象myCon是怎么创建,我只是想创建另外一个像它的对象
var temp = new myCon.constructor();
document.write(temp.name);
全局对象
宿主环境提供了一个全局对象并且所有的全局变量实际上是全局对象的属性。如果你的宿主环境是浏览器,全局对象就是window。
定义一个全局变量,比如:
var a = 1;
那么你可以以下方式访问这个全局变量:
- 作为一个变量a
- 作为全局对象的一个属性,比如window[‘a’]或者window.a
让我们回到定义构造器函数的情况,如果我们没有用new 关键字,在这种情况下this 指向全局对象并且给this设置的所有属性都成为了全局对象的属性。
function MyConstructor() {
this.name = 'John';
}
//没有使用new关键字创建一个MyConstructor,所以此时MyConstructor中的this指向了window
//this.name 相当于 window.name
var myCon = MyConstructor();
//对象myCon是undefined
alert(myCon);
alert(name);
alert(window.name);
instanceof操作符
通过 instanceof操作符,你可以测试一个对象是否是用指定的构造器函数创建的。
我们看下面的例子:
//定义一个构造器函数
function MyConstructor() {
this.name = 'John';
this.age = 19;
}
//实例化一个对象,用new关键字
var myCon = new MyConstructor();
document.write(myCon instanceof MyConstructor);
document.write(myCon instanceof Object);
document.write(myCon instanceof Array);

浙公网安备 33010602011771号