原型与原型链
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
是函数的属性
概念解释参考:原型与原型链详解