一、公用属性(原型)
所有对象都有 toString 和 valueOf 属性,那么我们是否有必要给每个对象一个 toString 和 valueOf 呢?明显不需要。
JS 的做法是把 toString 和 valueOf 放在一个对象里(暂且叫做公用属性组成的对象)
然后让每一个对象的 __proto__
存储这个「公用属性组成的对象」的地址。
二、函数对象
Object 、Function 是 JS 自带的函数对象。凡是通过 new Function() 创建的对象都是函数对象。
typeof Object // function
typeof Function // function
- 所有函数都是由 Function 构造出来的
Number.__proto__ === Function.prototype // 因为 Number 是函数,是 Function 的实例
Object.__proto__ === Function.prototype // 因为 Object 是函数,是 Function 的实例
Function.__proto__ === Function.prototype // 因为 Function 是函数,是 Function 的实例
三、公式
var 对象 = new 函数()
对象.__proto__ === 函数.prototype
所以
var number = new Number()
number.__proto__ === Number.prototype
var object = new Object()
object.__proto__ === Object.prototype
var str = new String()
str.__proto__ === String.prototype
var fn = new Function()
fn.__proto__ === Function.prototype
四、__proto__
与prototype
的区别
__proto__
是对象的属性
prototype
是函数的属性
五、原型链
var obj = new Object()
obj.toString()
当我们调用toString方法时,JS引擎会做下面的事情:
- 查看obj对象本身有没有toString属性,没有就走第二步。
- 查看
obj.__proto__
对象有没有toString属性,发现有,就找到了。
如果
obj.__proto__
对象没有toString属性,那么会继续查看obj.__proto__.__proto__
。
如果
obj.__proto__.__proto__
对象还是没有toString属性,那么再继续查看。obj.__proto__.__proto__.__proto__
,直到找到toString方法或者__proto__
为null(最终Boss)。
沿着__proto__
查找的路线就叫做原型链
。
网友评论