三、Object
1、介绍
Object也是JS内置的一个构造函数,它的实例通常被认为是所有其他对象的原型对象。实际上Object函数也有原型对象,这个Object的原型对象才是最顶层的一个对象。总之,根据原型链的关系,Object构造函数内提供的一些方法,以及Object函数的原型对象中的方法,都会为每个实例对象所拥有。
Obejct函数中自带的一些成员:
Object的原型对象的成员:
2、hasOwnProperty(property)
hasOwnProperty方法是Object函数的原型对象上的方法。
hasOwnProperty方法用于检测实例对象是否有非继承的属性,也就是自身有该属性。
3、create()
create()方法是Obejct构造函数内的成员方法,而且是一个静态方法(调用方式是直接使用Object来调用)。
create()方法用于创建对象,创建对象的时候,可以指定对象的原型对象。
或者另外的写法:
4、小结
四、继承
JS要实现继承,有非常多的方式,除了下面列举的三种以外,还有for…in可以实现继承。ES6中有extends关键字,可以实现继承。
1、冒充继承
案例中定义两个构造函数(类),父类中定义几个成员,然后让子类的实例去调用。如果调用成功,表示实现了继承。
父类.call(子类的对象, 其他参数); //意思是让子类的对象,去代替父类中的this。
这种实现继承的方式,是不能继承原型对象上的成员的:
2、原型链继承
3、create()继承
create()是IE9才开始支持的。
var 新对象 = Object.create(原型对象); 该方法就是用于指定原型对象的。所以就可以直接使用create方法实现继承。
五、this指向总结
this永远指向一个对象。
this指向的对象是谁,关键要看this运行的环境。也就是this所在的函数被赋值给哪个对象了,那么this就表示这个对象。
全局环境下,this表示window对象
1、事件处理函数中的this
HTML:
JS:
<table border="1" width="200" >
<tr>
<td> </td>
</tr>
</table>
<script>
//点击td,创建input放到td中
//在input中输入内容,当按回车的时候,将输入的内容放到td中
document.getElementsByTagName('td')[0].onclick = function () {
//console.log(this); // this就是绑定事件的那个对象,本例中就是td
var td = this; //先保存this为变量,这里的this还表示td
var input = document.createElement('input');
td.innerHTML = '';
td.appendChild(input);
input.focus();
input.onkeyup = function (evt) {
//console.log(this); // this 表示input
var e = window.event||evt;
var keyCode = e.keyCode;
if(keyCode == 13){
td.innerHTML = this.value;
}
}
};
2、面向对象中的this
>
区分this表示哪个对象,关键看调用函数的时候,函数是由谁来调用的。由o1调用,this就表示o1,由o2调用,this表示o2.
3、定时器中的this
setTimeout(); //一段时间后,执行一次
setInterval(); //间隔一段时间,执行一次
setTimeout('console.log(123);', 1000);
setTimeout('alert(123);', 1000);
function a(){
console.log(456);
}
//第一个参数是字符串,代码运行到这行是不会解析这个字符串的,在1秒后,要执行的时候才会解析前面的字符串
setTimeout('a()', 1000);
function a(){
console.log(789);
}
//第一个参数是变量的表示,代码运行到这行就会解析变量的意思。当然执行还是在1秒后
setTimeout(a, 1000);
var x = 1;
var o = {
x:2,
say:function () {
console.log(this.x);
}
};
function m(){
console.log(this.x);
}
setTimeout(o.say, 1000); // 1
setTimeout(function(){
console.log(this.x);
}, 1000);
setTimeout('o.say()', 1000); // 2 ,这种方式,say内部的this没有发生改变
//....
//....
//....
//o.say();