原型继承存在的两个问题今天就来和大家学习一下。学习之前先再一次说一说原型继承存在的两个问题。
1、无法在不影响所有实例的情况下,给要继承的构造函数传参
2、继承的构造函数中的引用类型对于所有的实例是共享的
那么,该如何解决这两个问题呢?解决这两个问题的方法也有两种。
一、原型继承
1、借用构造函数
function Person(father,mother){
this.father=father;
this.mother=mother;
}
Person.prototype.showInfo=function(){
console.log(this.father+","+this.mother);
}
function Student(name,father,mother){
this.name=name;
Person.call(this,father,mother);
}
var stu=new Student("Sue","Mike","Anglo");
由以上代码块可以清楚的看出,通过借用构造函数,就可以解决给要继承的构造函数传参且不影响其他的实例
2、组合继承
function Person(father,mother){
this.father=father;
this.mother=mother;
}
Person.prototype.showInfo=function(){
console.log(this.father+","+this.mother);
}
function Student(name,father,mother){
this.name=name;
Person.call(this,father,mother);
}
Student.prototype=new Person("Mike","Anglo");
Student.prototype.showInfo=function(){
console.log(this.name);
}
var stu=new Student("Sue","Mike","Anglo");
组合继承中,将Person.prototype也处于Student的原型链中,那么,Person构造函数中的属性和方法,Student自然也可以使用。该种继承方式较推荐使用。
二、作用域
作用域,按照字面的以上是作用的区域。而区域分为两种。
1、全局作用域
所有的全局作用域中的变量和函数都是window的属性,通过delete方法可以删除全局变量,但不能删除通过var、function声明的变量。全局作用域中的成员对所有函数都可见
2、函数作用域
函数作用域中的变量对外不可见,只能在函数内部使用
例:
var a=1;
var fn=function(){var b=2;}
c=3;
delete c;
delete a;
三、预解析
(1)若遇到同名的变量或函数,以函数为准,函数的优先级比变量高
(2)全局作用域:所有的全局变量和函数声明都提前,变量提前仅仅是变量名提前,赋值不提前
(3)函数作用域:所有局部变量和内部函数声明以及参数都提前
四、闭包
(1)什么是闭包?通俗的说,闭包是封闭的包裹,若用较为专业的术语,闭包也可以说的函数的嵌套
(2)闭包是如何形成的?由闭包的含义就可以知道,闭包是由于函数的嵌套而形成的
(3)闭包都包括哪些内容?闭包包扩,有一个函数,作用域(内层函数的外部作用域)
关于以上所提到的知识或许不是很精准,但有些还是可以提供大家学习、了解,若各位觉得有出入的地方可以在下方留言,说说自己的了解和看法。