定义继承有哪些方式
1. 原型链继承
function Father(){
this.color=["red","blue"]
}
function Son(){ }
Son.prototype=new Father()
优点:可以复用父类下的属性和方法
缺点:不能给父类下的变量传值,属性被孩子共享,一个改变全改变
2. 构造函数继承
function Father(name){
this.color=["red","blue"]
this.name=name
}
function Son(name){
Father.call(this,name)
}
优点:父类下的数据不被共享,子类可以借助父类构造器赋值
缺点:无法实现代码复用,每一个孩子赋值父类的副本
3.组合继承
function Father(name){
this.name=name//借用的
}
function Son(name){
Father.call(this,name)
}
Father.prototype.color=["red","blue"]//共享的
Son.prototype=new Father()
优点:既可以找到原型上的属性和方法继承,又可以给父类进行传参
缺点: 每创建一个新对象,多次调用父类对象构造器,会在内存生成多个,浪费资源
4.原型模式继承
var Father={color:["red","blue"]}
function person(obj){
function F(){}
F.prototype=obj
return new F()
}
var s1=person(Father)
优点:可以复用父类下的属性和方法
缺点:不能给父类变量传值,属性被孩子对象所共享,一个改变都改变
5.寄生继承模式
var Father={color:["red","blue"]}
function person(obj){
function F(){}
F.prototype=obj
var f= new F()
f.say=function(){
console.log(this.color)
}
return f
}
优点:可以复用父类下的属性和方法,是原型模式的增强版,可以自己新增属性和方法
缺点:不能给父类变量传值,属性被孩子对象所共享,一个改变都改变
6.寄生组合继承
function Father(name){
this.name=name
}
Father.prototype.color=["red","blue"]
function Son(name){
Father.call(this,name)
}
function fun(son,father){
son.prototype=Object.create(Father.prototype)
son.prototype.constructor=son
}
fun(Son,Father)
var s1=new Son("asd")
优点:可以借助父类构造器,可以共享原型数据,可以创建不同实例对象,可以实现深拷贝,解决了资源浪费
严格模式
用来消除js语法中不合理的不严谨的代码,让代码运行更啊安全,提高编译效率
定义:
"use strict"
限定内容
- 变量必须要用var声明
- 函数的顶层不在指向window,而是指向undefined
- 不能定义和eval同名的变量或函数
- 禁止使用delete关键字删除
- 禁止使用argument,和calee和caller方法
- 禁止使用width语句
- 禁止函数重名
- 禁止对象属性重名
- 禁止使用八进制数
- 不允许在非函数代码块中声明函数
例如:
"use strict"
a=12
console.log(a)//不用var声明报错
//不能用with语句
with(location){
console.log(href)
console.log(location.pathname)
console.log(location.port)//端口号
}