0
点赞
收藏
分享

微信扫一扫

[JavaScript]之原型与原型链

一、公用属性(原型)

所有对象都有 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引擎会做下面的事情:

  1. 查看obj对象本身有没有toString属性,没有就走第二步。
  2. 查看obj.__proto__对象有没有toString属性,发现有,就找到了。
    如果
    obj.__proto__对象没有toString属性,那么会继续查看obj.__proto__.__proto__
    如果
    obj.__proto__.__proto__对象还是没有toString属性,那么再继续查看。obj.__proto__.__proto__.__proto__,直到找到toString方法或者__proto__为null(最终Boss)。
    沿着__proto__查找的路线就叫做原型链
举报

相关推荐

0 条评论