JavaScript原型(初识)

原型本质:所有的构造函数都有一个prototype属性,该属性是指向函数的原型对象

所有的实例都有一个_proto_属性,该属性指向产生实例对象的构造函数的原型

_proto_不是标准属性,在Chrome,Safari,Firefox浏览器叫_proto_,在别的浏览器这个属性对脚本是不可见的, 实际上该属性是浏览器内部使用的,编程的时候不允许使用

_proto_属性和构造函数中的prototype指向同一块区域.因此下面代码结果为true

console.log(Person.prototype===p1.__proto__) //true

原型的好处就是可以实现实例对象之间共享属性和方法

function  Person(name,age){
    this.name = name;
    this.age = age;
}

Person.prototype.showName =function(){console.log(this.name);}
Person.prototype.showAge =function(){console.log(this.age);}
Person.prototype.arr = ['red','yellow'];
var p1 = new Person('zhangsan',12);
var p2 = new Person('lisi',13);
p1.showName();
p2.showName();
console.log(p1.showName === p2.showName);//true
prototype1.png

我们在调用p1.showName()与p2.showName()时,解析器会问:实例p1中有showName属性吗?答案是:没有? 然后继续问:p1原型中有showName属性吗?答案是:有,因此就可以读取到在原型中的showName函数

上边代码 给原型中的arr数组push新的值,如p1.arr.push('black');p1与p2访问到的值也是相同的

prototype1.png

注意
如果写成p1.arr = ['pink'];相当于创建了一个新的属性,加到p1的实例对象,并没有加到原型中;
因此获取p1.arr的值就是pink,在执行p1.arr的时候
解析器会问:实例对象p1中有arr属性吗? 答案是:有 ,如果在实例对象中找到了具有给定名字的属性,那么就直接返回属性的值,如果没有找到才会到原型对象中找

总结
通过obj.arr =值;相当于创建了一个新的属性,加到obj中实例对象
但是obj.arr.push(123);这种结构不会再obj中添加一个属性,而是在arr中添加了一个值

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

推荐阅读更多精彩内容

  • 一、JavaScript基础知识回顾 1.1 JavaScript 1.1.1 javascript是什么? Ja...
    福尔摩鸡阅读 1,345评论 0 7
  • 原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好。 不...
    晨光2016阅读 1,308评论 8 13
  • 转载请著名出处 GitHub-TYRMars 文章Github地址 JavaScript基础知识剖析 01 01-...
    TYRMars阅读 585评论 0 7
  • 大巧若拙,大音希声,情深总是无言。一个名字,“Jane”,舌与上牙床轻轻触碰,好像情人间的低低呢喃。...
    leahgao阅读 202评论 0 0
  • 有时候会头疼。 我知道这事儿要跟我妈一说,又了不得了,必须得戳我脑门:该,再让你当初坐月子时不听老人的话。这种时候...
    牟牟的阅读 284评论 0 4