JS继承6种方式
- 为什么需要继承
因为需要用到其他类的方法,但是直接给prototype赋值,因为只是地址引用,所以修改时会影响
var obj = {
constructor: fn
getX: function() {
}
}
function fn () {
}
fn.prototype = obj
这事修改obj,会影响到fn,修改fn的ptototype,也会影响obj
所以需要继承
- 用循环把需要继承的类里面的所有属性和方法复制一份给另外一个
跟父类没有关系
var obj = {
constructor: fn
getX: function() {
}
}
var obj={}
for(var key in obj) {
if(obj.hasOwnProperty(key)){
obj2[key] = obj[key]
}
}
var obj2 = Object.create(obj)
- 原型链继承:继承父类所有的属性和方法(私有+公有)
跟父类有关系
B.prototype = new A
- call继承:将父类私有的变成子类私有的
跟父类没有关系
function A() {
this.x = 100
}
A.prototype.getX = function() {
}
function B() {
A.call(this)
}
var n = new B
- 冒充对象继承:跟循环复制一样,跟父类没有关系
- 混合模式继承:原型继承+call继承
跟父类有关系
function A() {
this.x = 100
}
A.prototype.getX = function() {
}
function B() {
A.call(this)
}
B.prototype = new A 继承公有和私有
B.prototype.constructor = B
- 寄生组合式继承:子类私有继承父类私有,公有继承公有
跟父类有关系
function A() {
this.x = 100
}
A.prototype.getX = function() {
}
function B() {
A.call(this)
}
B.prototype = Object.create(A.prototype)
B.prototype.constructor = B
arguments.__proto__ =Array.prototype
- 补充知识点
- 实例虽然没有constructor,但是可以通过proto找到所属类的原型上的constructor
- 公有属性是不可枚举的
- 每个函数本身也是函数的实例,所以也是对象数据类型的,也有proto