console 中dir与log的区别
log
语句打印的是结果,直接显示信息;dir
语句打印的是内容,对显示对象的所有属性和方法。
原型与原型链
Object是系统的构造函数,里面就应该有prototype,又是对象,对象里面就应该有__proto__,最终的这个一定会指向null
原型链:是实例对象和原型对象之间的关系,是__proto__原型来链接的
-
实例对象有__proto__原型
-
构造函数有prototype原型
-
prototype是对象,那么也有__proto__原型
改变原型指向
假设有两个对象Person,Student
改变原型指向只需要把改对象的prototype修改即可,例如:
Person.prototype = {
play:function () {
console.log(this);
}
}
这样便把Person的原型修改为了一个有play方法的对象
继承
直接将对象的Prototype 指向一个实例对象或对象来继承属性与方法
为了数据共享,改变了原型指向,做到了继承,但是继承过来的属性值也是一样的
解决:继承的时候不要改变原型的指向,直接调用父级的构造函数的方式来赋值,叫借用构造函数
借用构造函数
在对象里面赋值时,可以直接将父亲的构造函数借用过来用 call方法
function Student(score, name, money, house) {
this.score = score;
// 把父亲的构造函数借过来--->改变构造函数的之乡,继承属性
Person.call(this, name, money, house);
// this指的是当前函数所创建出来的对象
// 后面的参数是父亲的形参,这个形参Student要用,所以需要Student的构造函数的小括号接收一下
}
这种方法 的name,maney,house都是利用Person对象的方法来赋值的
总结:
原型继承:改变原型的指向
借用构造函数继承:改变构造函数属性的指向
组合继承:原型继承 + 借用构造函数继承,既能解决属性问题,又能解决方法问题
拷贝继承:就是把对象中需要共享的属性和方法,以遍历的方式复制到另一个对象
**注意区分属性与方法
拷贝继承
拷贝继承:就是把对象中需要共享的属性和方法,以遍历的方式复制到另一个对象
var obj2 = {};
for(var key in Person.prototype) {
obj2[key] = Person.prototype[key];
}
this指向
- 普通函数的this指向:window
- 构造函数的this指向:实例对象
- 对象和方法中的this指向:当前实例对象
- 定时器中的this指向:window
- 原型对象方法中的this指向:实例对象