2019-04-22原型和原型链

原型链图:


image.png

问题1.为什么需要原型及原型链?
先来一个例子:

function Person(name,age){
    this.name=name;
    this.age=age;
    this.eat=function(){
        console.log("我叫"+name+",今年"+age+"啦");
        
    }
}
var p1=new Person("jspang",18)
var p2=new Person("jspang",18)
p1.eat();
p2.eat();
console.log(p1.name===p2.name);//true,名字是一样

console.log(p1.eat===p2.eat);//false,但同一个方法不一样

上面代码总结:同一个构造函数实例化的方法是不相等的.
可以看到,对于同一个函数,我们通过 new 生成出来的实例,都会开出新的一块堆区,所以上面代码中 p 1 和 p2 的吃饭是不同的。

拥有属于自己的东西(例如房子、汽车),这样很好。但它也有不好,毕竟总共就那么点地儿(内存),你不停地建房子,到最后是不是没有空地了?(内存不足)

所以,咱要想个法子,建个类似于共享库的对象(例如把楼房建高),这样就可以在需要的时候,调用一个类似共享库的对象(社区),让实例能够沿着某个线索去找到自己归处。

而这个线索,在前端中就是原型链 prototype。
上面代码进行改造:

function Person(name,age){
this.name=name;
this.age=age
}
Person.prototype.eat=function(){
    console.log("吃饭");  
}
var p1=new Person("jspang",18)
var p2=new Person("jspang",18)
console.log(p1.eat==p1.eat);//ture,原型里的方法相同

总结:原型里的方法相同.

形象的原型链故事图:


image.png

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,139评论 0 6
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,141评论 1 32
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,161评论 0 21
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,442评论 0 9
  • 生活中的琐事本不值一提,可琐事多了就跟渔网挂了贝壳,不清理就会愈发沉重……
    悲伤的山羊阅读 478评论 0 0