Skip to content

原型 继承

读懂一张图

1547101387038-dfab510f-9cec-49df-be1a-97f29ad34790.png

new Foo().proto = Foo.ptototype

function Foo().ptototype.ptoto = Object.prototype

Foo.proto = Function.prototype

Function.prototype.proto = Object.prototype

Object.prototype.proto = null

// constrctor

Object.prototype.constrctor = function Object()

function Object().proto = Function.prototype

Function.prototype.constrctor = function Function()

function Function().proto = Function.prototype

Object.create

Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__

把新建对象的__proto__指向自己

1550029597311-15160d0b-2d62-443f-af14-207faa338912.png

Function 对象

Function.prototype是引擎创造的

函数就是对象

var sum = new Function('a', 'b', 'return a + b');

Function 是最顶层的构造器。它构造了系统中所有的对象,包括用户自定义对象,系统内置对象,甚至包括它自已

Object 是最顶层的对象,所有的对象都将继承 Object 的原型

Object 也是一个函数对象 所以说 Object 是被 Function 构造出来的。

prototype

prototype 如何产生的

当我们声明一个函数时,这个属性就被自动创建了。

prototype 属性。这是一个显式原型属性,只有函数才拥有该属性

class是prototype的语法糖,最后通过babel转化

Chrome:51 版起便可以支持 97% 的 ES6 新特性。

ES6 classes are syntactical sugar to provide a much simpler and clearer syntax to create objects and deal with inheritance.

proto

这是每个对象都有的隐式原型属性,指向了创建该对象的构造函数的原型

因为在 JS 中是没有类的概念的,为了实现类似继承的方式,通过 proto 将对象和原型联系起来组成原型链,得以让对象可以访问到不属于自己的属性。

constructor

constructor是prototype对象的属性

constructor 是一个公有且不可枚举的属性。一旦我们改变了函数的 prototype ,那么新对象就没有这个属性了

作用

让实例对象知道是什么函数构造了它

function 就是一个语法糖
内部调用了new Function(...)

new 的过程

实现一个new

javascript
function create() {
    // 创建一个空的对象
    let obj = new Object()
    // 获得构造函数 arguments[0]是构造函数
    let Con = [].shift.call(arguments)
    // 链接到原型
	obj.__proto__ = Con.prototype
    // 绑定 this,执行构造函数
    let result = Con.apply(obj, arguments)
    // 确保 new 出来的是个对象
    return typeof result === 'object' ? result : obj
}

Function.proto === Function.prototype

Function.proto.proto === Object.prototype

首先引擎创建了 Object.prototype ,然后创建了 Function.prototype ,并且通过 proto 将两者联系了起来

因为 Function.prototype 是引擎创建出来的对象,引擎认为不需要给这个对象添加 prototype 属性。

总结

  • Object 是所有对象的爸爸,所有对象都可以通过 __proto__ 找到它
  • Function 是所有函数的爸爸,所有函数都可以通过 __proto__ 找到它
  • Function.prototype 和 Object.prototype 是两个特殊的对象,他们由引擎来创建
  • 除了以上两个特殊对象,其他对象都是通过构造器 new 出来的
  • 函数的 prototype 是一个对象,也就是原型
  • 对象的 __proto__ 指向原型, __proto__ 将对象和原型连接起来组成了原型链

参考文章

https://github.com/KieSun/Blog/issues/2

更新: 2019-02-13 11:46:39
原文: https://www.yuque.com/u3641/dxlfpu/ov6wbl