javascript中是没有类这个概念的,但是javascript有它自己的原型机制,我们可以通过原型机制(prototype,constructor)来伪一个类出来,俗称“伪类”。
新函数对象被创建时,会被赋予一个prototype属性,它的值是一个包括constructor属性,且属性值为该新函数的对象,用代码来解释就是:
Cat.prototype.constructor = Cat
介绍javascript原型机制的文章博客园有很多,可以自己找来看看哦。
构建伪类的第一步是定义一个构造器:
function Animal(kind) { this.kind = kind || "哺乳类" }
第二步就是扩充它的原型:
Animal.prototype.getKind = function() { return this.kind }
接下来就可以实例化啦,是不是很简单啊,想实例化多少个都可以哦
var aaa = new Animal("两栖类") var bbb = new Animal("飞禽类") console.log(aaa.getKind()) //两栖类 console.log(bbb.getKind()) //飞禽类
好了,介绍完怎么构建伪类之后该进入正题了,那我们如何来实现“继承者们”呢?
Step One:
我们的目的是继承,继承当然是要给Animal生个儿子(没儿子怎么继承)那父亲是个类,儿子也必须是个类啦,所以还是老步骤。
function Cat() { Animal.call(this, "哺乳类") }
Cat是子类的构造函数,那么问题来了,Animal.call(this)是什么东西?其实它在这里的作用就是调用父类的构造函数。
Step Two:
Cat.prototype = new Animal()
这句话是类继承的关键,把Animal的实例赋值给Cat的prototype,这样Cat的原型就拥有了Animal的原型的方法和属性,但是又不会影响到Animal。
Step Three:
Cat.prototype.constructor = Cat
由于Cat.prototype之前被卖给了Animal,所以Cat.prototype的构造函数指向了Animal,这句代码的作用就是把Cat再弄回来。
上面都是类式继承的基本步骤,下面我们来个实例试试看:
function Animal(kind) { this.kind = kind || "哺乳类" } Animal.prototype.getKind = function() { return this.kind } function Cat() { Animal.call(this, "哺乳类") } Cat.prototype = new Animal() Cat.prototype.constructor = Cat Cat.prototype.miao = function() { return "我是子类独有的方法哦,喵~" } var aaa = new Animal("两栖类") var bbb = new Animal("飞禽类") console.log(aaa.getKind()) //两栖类 console.log(bbb.getKind()) //飞禽类 var cat_aaa = new Cat() console.log(cat_aaa.getKind()) //哺乳类 console.log(Cat.prototype.constructor) //指向Cat,如果之前不改回来,指向的会是Animal //console.log(aaa.miao()) //undefined is not a function 父类是用不了miao的哦 console.log(cat_aaa.miao())
结果是不是都是期望的值呢?
有兴趣的同学可以试试console.log(cat_aaa), 看看会出现什么。
如果需要继承的地方很多,那一直这么重复去写类似的继承方式会很麻烦,所以我们来定义一个inherits方法,会使继承的实现更简洁:
Function.prototype.inherits = function(func) { this.prototype = new func() this.prototype.constructor = this }
代码很容易看懂吧,接下来看看应用:
function Animal(kind) { this.kind = kind || "哺乳类" } Animal.prototype.getKind = function() { return this.kind } function Cat(name) { Animal.call(this, "哺乳类") } Cat.inherits(Animal); Cat.prototype.miao = function() { return "我是子类独有的方法哦,喵~" } var cat_bbb = new Cat() console.log(cat_bbb.miao())
ok,完工了,继续改bug去~