继承链

类别备注constructorprototype__poroto__
(构造)函数函数即对象指向Function指向一个constructor为自身的空对象
对象指向创建该对象的构造函数源于创建该对象的构造函数的显式原型
Function是所有构造器的源头指向自身对象的constructor指向自身
ObjectObject.prototype是所有原型的源头指向Function是一个constructor指向自身的空对象

参考于:

面向对象的继承

  1. 基于对象的原型实现

    1
    object.__proto__ = obj

    指向一个对象

  2. 基于构造函数的原型实现

    1
    Object.prototype

    指向一个空对象

继承常见的几种方式

  • 原型链继承: 原型与对象继承; 只继承于原型
    问题:
    1. 实际上并不是真正的继承, 其实是多个构造函数之间共享一个对象(属性和方法)
    2. 创建子类的对象时, 不能向父级的构造函数传递任何参数。
  • 原型式继承
  • 借助构造函数: apply() 或 call() 方法
    问题: this 的传递
  • 组合方式继承: 原型链 + 构造函数

面向对象

对象

创建对象的方式

  1. 构造函数方式

    1
    var obj = new Object()
  2. 直接量方式

    1
    2
    3
    4
    5
    6
    var obj = {
    name: "lilei",
    sayMe: function () {
    console.log("this is lilei");
    }
    }

构造器(constructor)

对象的构造器都是指向创建该对象的构造函数。例如以下示例代码:

1
2
function Foo() {}
var foo = new Foo()

上述示例代码中的 foo 对象的构造器就是 Foo。

隐式原型(__proto__)

对象的隐式原型与创建该对象的构造函数的显式原型是指向同一个对象。

1
2
3
4
function Foo() {}
var foo = new Foo()

console.log(foo.__proto__ === Foo.prototype)

函数

函数创建方式

  1. 直接量方式

    1
    var fun = function(){}

    与 JavaScript 中的变量是存在关系,例如以下示例代码:

    1
    2
    3
    4
    var fun = function(){}
    var fun = 'this is text'

    console.log(fun) // 'this is text'

    上述示例代码存在覆盖问题。

  2. 初始化器方式

    1
    function fun(){}
  3. 构造函数方式

    1
    var fun = new Function()

    上述示例代码说明函数是一个 Function 类型的对象。

函数的特性

  1. 函数可能与变量之间存在关系(直接量方式定义函数时)
  2. 函数与构造函数允许同时存在的
  3. 函数是一个 Function 类型的对象

显式原型(prototype)

构造函数的显式原型与利用该构造函数所创建对象的隐式原型是指向同一个对象。

构造器(constructor)

函数的构造器就是 Function。

1
2
3
function fun(){}

console.log(fun.constructor === Function)

隐式原型(__proto__)

函数的隐式原型与 Function 的显式原型是指向同一个对象。