原型与原型链

一、概念

原型
在JavaScript中,每当定义一个函数数据类型(普通函数、类)时候,都会天生自带一个prototype属性,这个属性指向函数的原型对象,并且这个属性是一个对象数据类型的值。
原型链
对象之间的继承关系,在JavaScript中是通过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了一个原型指向的链条,专业术语称之为原型链。

二、浅析

当我们声明对象时,js 会在栈里生成对象现有属性,并将__proto__指向原型

如图

1.当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,找到则直接使用
2.若未找到,则去原型对象中寻找,找到则直接使用。
3.若仍未找到,则去原型的原型中寻找,直到找到Object原型。
4.如果在Object原型中依然没有找到,则返回undefined。

String Number Boolean 与 Object 不同
Object比其它三种类型的寻找次数少一次

String :自身属性 -> String原型 -> Object原型
Object:自身属性 -> Object原型

var o1={}
o1.__proto__===Object.prototype //true

var n1=new Number(1)
n1.__proto__===Number.prototype //true
n1.__proto__.__proto__===Object.prototype //true
// String Boolean 也类似
var o1=new Object()
var o2=new Object()
01===02 // false
01.toString===02.toString //true 因为toString是共用属性

prototype__proto__

prototype是window默认存在的,比如:
String.prototype 是 String 原型的引用(默认存在,不写代码也有。指向String原型,防止原型被浏览器回收)

var s=new String('11')
s.__proto__ 也是是 String 原型的引用(写了代码后才有)

对象.__proto__ === 对象的构造函数.prototype
两者的区别是:__proto__是对象的属性,prototype是函数的属性


概念解释参考:原型与原型链详解

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

推荐阅读更多精彩内容