原型链
在JavaScript中万物都是对象,对象和对象之间也有关系,并不是孤立存在的。对象之间的继承关系,在JavaScript中是通过prototype对象指向原型,再通过proto指向Object对象原型为止,这样就形成了一个原型指向的链条,专业术语称之为原型链。
- 在原型上定义的属性和方法,创建出来的实例也会拥有原型上的属性和方法
- 实例上有属性就用实例的属性,实例上没有就去找原型上的属性,原型上没有就去找原型的原型(原型链终极)上的属性
四、预编译
- JS运行三部曲:
- 1、语法分析
- 2、预编译
- 3、解释执行代码
- 简单总结:变量声明提升,函数声明整体提升
- 具体:
- 1、创建一个AO对象(Activation Object)执行期上下文
- 2、寻找形参和变量声明作为AO对象属性名,值为undefined
- 3、将实参与形参统一
- 4、在函数体中寻找函数声明,值为函数体、
js5的this指向
第一种:方法调用 this指向这个方法的对象
var age = 38;
var obj = {
age: 18,
getAge: function() {
console.log(this.age);
}
};
obj.getAge();
//这个this指向obj
--------------------------------------------------
// 变式:
var fn = obj.getAge;
fn();
//这个this指向window,因为这个把方法赋值给这个变量了
第二种:函数调用,里面的this指向的是window
第三种:构造函数调用:this指向调用它的对象
第四种:上下文调用模式,this指向谁?指向的是传入的对象
相同点
都“可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象”。
例如:
apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。
call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。
不同点
apply:最多只能有两个参数——新this对象和一个数组argArray。(简单地说就是第二个参数传的是数组)
call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。(简单地说就是第一个参数后传的都是参数)
new 关键字的作用
1、在构造函数里面创建一个对象obj
2、将函数里面的this指向创建的那个对象obj
3、执行构造函数方法,属性和方法被添加到this引用的对象中
4、返回这个obj对象
5.闭包
概念:闭包就是有权访另一个函数作用域中变量的函数
产生:当内部函数保存到外部时,就会产生闭包
形式:比如一个a函数中return一个函数,在return得这个函数中使用a函数中的变量,
缺陷:因为变量在被使用所以无法被垃圾回收机制回收
函数继承
继承
ES5的继承
1、构造函数实现继承,有个缺点,不能继承原型
function Parent(){
this.name = "parent"
}
Parent.prototype.aa=function(){}
function Child(){
Parent.call(this)
this.type ="child"
}
console.log(new Child())
2、借助原型是实现继承,child修改值得时候,Parent new出来的对象的值也会被修改
function Parent(){
this.name = "parent"
this.arr = [1,2,3]
}
function Child(){
this.type = "child"
}
Child.prototype = new Parent()
var A = new Child()
var B = new Child()
A.arr.push(4)
console.log(A,B)
3、组合方式实现继承
function Parent(){
this.name = "parent"
this.arr = [1,2,3]
}
function Child(){
Parent.call(this)
this.type = "child"
}
Child.prototype = Object.create(Parent.prototype)
//因为把原型
Child.prototype.construcotr = Child
var A = new Child()
var B = new Child()
A.arr.push(4)
console.log(A,B)
ES6的继承
class People{
constructor(name,age){
this.name = name
this.age = age
}
eat(){
}
}
class Student extends People{
constructor(id,name,age){
super(name,age)
this.id = id
}
}
从输入URL到页面展示的过程
网友评论