title | date | tags | categories |
---|---|---|---|
我应该怎样理解JavaScript的继承?(一) |
2017-11-04 13:40:32 -0700 |
JavaScript |
JavaScript |
当我们了解了原型之后,我们会对以前的知识有所疑问,比如说我们新建一个对象,我们并没有new(实例化)它,那他的原型是什么呢?
我们点开它的_proto_会发现它的constructor是Object,这样我们就明白了,其实这个a是个函数,它也是Object创造的,var a = {}
和var b = new Object()
是一样的,所以a.constructor === b.constructor
是为真的,本质上都是在实例化。
那现在我要是想要一个完全不继承的对象呢?我们可以使用Object.create(null)
,我们创造了一个为null的原型,这样我们就得到了一个完全不继承的对象。
那么我们知道Object.create()
可以创造原型了,那么我们现在就来实现一下构造函数继承。
首先我们写个构造函数:Animal,并给它吃和睡的特性,由于这些特性属于所有动物共有的,所以把它放进原型属性中,并实例化它
// 动物
function Animal(){
}
Animal.prototype.eat = function(){
console.log('吧唧吧唧');
}
Animal.prototype.sheep = function(){
console.log('呼噜噜噜');
}
var gaga = new Animal();
可以看到peppa中已经有了吃和睡的特性
现在再写一个构造函数:Mammal,这次我们不光使其有哺乳的特性,还要继承Animal的特性,那么怎么办呢?
现在就可以用到Object.create()
了,我们把Animal的原型写进去:Object.create()
// 动物
function Animal(){
}
Animal.prototype.eat = function(){
console.log('吧唧吧唧');
}
Animal.prototype.sheep = function(){
console.log('呼噜噜噜');
}
// 哺乳动物
function Mammal(){
}
Mammal.prototype = Object.create(Animal.prototype);
Mammal.prototype.suckle = function(){
console.log('Emmmmm');
}
var peppa = new Mammal();
上面我们已经看到了,peppa已经拥有了动物和哺乳动物的所有特性了。
啪啪啪!
现在还有一个问题就是我们发现Mammal的constructor没了,是因为在写入Animal原型的时候我们把它给覆盖掉了,我们只需要重写回来就好了
...
Mammal.prototype = Object.create(Animal.prototype);
Mammal.prototype.constructor = Mammal;
Mammal.prototype.suckle = function(){
console.log('Emmmmm');
}
...
-
原生对象本身也是被实例化创造的
-
Object.create()
可以写入原型属性 -
写入原型属性时,自身的constructor会被覆盖,只要重新写回来就好
-
Constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是Object()。