Orion's Studio.

OO in JS(2)

2017/12/24

瞎扯一通

按照我个人的理解,每创建一个函数(不妨取名为 A ),同时会创建一个constructor为 A 的同名原型对象,而函数 A 的prototype是该原型对象。

也就是说,每当用new A()创建一个新实例时,就会调用 A ,并且新实例的__proto__为该原型对象。

而原型链,就是将函数的prototype改为某个实例,新实例的__proto__就是该实例。按照下面代码的例子,整条链就是:dd -> cc -> bb -> aa -> a的原型对象 -> Object

还是贴代码实在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function a () {
this.A = 'constructor'
}
function b () {
this.B = 'constructor'
}
function c () {
this.C = 'constructor'
}
function d () {
this.D = 'constructor'
}

a.prototype.A = 'prototype'
let aa = new a()

b.prototype = aa
let bb = new b()

c.prototype = bb
let cc = new c()

d.prototype = cc
let dd = new d()

aa // a {A: "constructor"}
bb // a {B: "constructor"}
cc // c {C: "constructor"}
dd // d {D: "constructor"}

aa.__proto__ === a.prototype // true
bb.__proto__ === aa // true
cc.__proto__ === bb // true
dd.__proto__ === cc // true

aa.constructor // a
bb.constructor // a,注意不是b了
cc.constructor // a
dd.constructor // a

aa instanceof a // true
bb instanceof a // true
bb instanceof b // true
cc instanceof a // true
cc instanceof b // true
cc instanceof c // true
...
CATALOG
  1. 1. 瞎扯一通
  2. 2. 还是贴代码实在