JS继承6种方式

JS继承6种方式

  • 为什么需要继承
    因为需要用到其他类的方法,但是直接给prototype赋值,因为只是地址引用,所以修改时会影响
var obj = {
    constructor: fn //对象本来是没有constructor,手动加的
    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]
    }
}
  • object.create
// 一个对象作为新创建对象的原型
var obj2 = Object.create(obj)
// 但是修改obj还是会影响到obj2的原型
  • 原型链继承:继承父类所有的属性和方法(私有+公有)
    跟父类有关系
B.prototype = new A
  • call继承:将父类私有的变成子类私有的
    跟父类没有关系
function A() {
    this.x = 100
}
A.prototype.getX = function() {
}
// B继承A,将A里面的this,变成B的this,而B的this有是n,所以可以用n.getx
function B() {
    A.call(this)
}
var n = new B
//此时n就可以用A的私有方法,不能用公有方法getX,因为跟原型没关系,只有把A当普通函数在B里执行
  • 冒充对象继承:跟循环复制一样,跟父类没有关系
  • 混合模式继承:原型继承+call继承
    跟父类有关系
function A() {
    this.x = 100
}
A.prototype.getX = function() {
}
function B() {
    A.call(this) //继承私有
}
B.prototype = new A 继承公有和私有
B.prototype.constructor = B
//所以这个继承的弊端,私有属性在B的私有和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
  • 补充知识点
    1. 实例虽然没有constructor,但是可以通过proto找到所属类的原型上的constructor
    2. 公有属性是不可枚举的
    3. 每个函数本身也是函数的实例,所以也是对象数据类型的,也有proto

猜你喜欢

转载自blog.csdn.net/millions_02/article/details/80294511