2018/7/15 15:09:15当前位置媒体热门新闻热点浏览文章

继承二字不如扩展来的直接。
A继承了B,则A能访问B属性和方法,并能覆盖。

    function Animal(name,age){        this.name = name;        this.age = age;    }    Animal.prototype.name = "( 没有填写 )";    Animal.prototype.sex = 男    Animal.prototype.info = function(){        console.log(`我叫${this.name},今年${this.age},性别${this.sex}`);    }    var animal = new Animal(小遁,24);    animal.info();

输出:我叫小遁,今年24,性别男
能看做animal 对Animal.prototype的继承。
先在实例中找,假如未定义再到Animal.prototype中找。
所以 new Animal(小遁,24);不传第一个参数,调使用animal.info,Animal.prototype.name起不到作使用,由于定义了this.name

继承泛化少量,是A如何访问B的属性和方法,于是乎,就有了各种耳熟可以详的版本了。

原型链继承

我觉得上一种应该叫原型链继承...

    function Cat(name){        this.name  = name;    }    Cat.prototype = new Animal(小遁,24);    Cat.prototype.sound = function(){        console.log(喵喵喵)    }    var cat = new Cat(小花猫);    cat.info();    cat.sound();    var cat1 = new Cat(小白猫);    cat.info();

输出
我叫小花猫,今年24,性别男
喵喵喵
我叫小花猫,今年24,性别男

这里 new Animal(小遁,24);传入参数只是起到默认值的作使用。
Cat.prototype 是所有Cat 实例共享的哦!

image.png

这时 Cat.prototype实际上是 Animal的一个实例
Cat.prototype = new Animal(小遁,24); 所起到的作使用一目了然。

这也是以下输出都为true的起因

    console.log(cat instanceof Cat)    console.log(cat instanceof Animal)    console.log(cat instanceof Object)

proto 为隐性原型链,prototype为显性原型链 instanceof 会以 Cat.prototype === cat.proto为准,
不断递归cat.proto 直到返回为null为止

构造继承

    function Cat(name){        Animal.call(this,name);    }    var cat = new Cat("小遁");    console.log(cat.info);    console.log(cat.name)

undefined
小遁

不可以访问Animal.prototype
Animal.call(this,name); 相当于调使用了Animal(name),只不过this的指向根据环境决定,在上例中相当于为cat增加了name、age属性。

假如Animal.call(this)放在全局作使用域下,则会添加到windows下!

剩下不逐个列举了。
至于extends,Object.create等以与上文多有出入,也不列举了。

网友评论