Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save zhouyanyu/721b198a555d940ecea315ec62830c3e to your computer and use it in GitHub Desktop.
Save zhouyanyu/721b198a555d940ecea315ec62830c3e to your computer and use it in GitHub Desktop.
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();

继承4.png

可以看到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();

继承5.png

上面我们已经看到了,peppa已经拥有了动物和哺乳动物的所有特性了。

啪啪啪!

现在还有一个问题就是我们发现Mammal的constructor没了,是因为在写入Animal原型的时候我们把它给覆盖掉了,我们只需要重写回来就好了

...
Mammal.prototype = Object.create(Animal.prototype);
Mammal.prototype.constructor = Mammal;
Mammal.prototype.suckle = function(){
    console.log('Emmmmm');
}
...

继承6.png

总结

  • 原生对象本身也是被实例化创造的

  • Object.create()可以写入原型属性

  • 写入原型属性时,自身的constructor会被覆盖,只要重新写回来就好

  • Constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是Object()。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment