饥人谷技术博客

原型与原型链

2019-07-01  本文已影响3人  YukiWeng

一、概念

原型
在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是函数的属性


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

上一篇下一篇

猜你喜欢

热点阅读