JavaScript 原型链
当我们定义了一个函数或者对象的时候,自带有属性中有一个属性 __proto__,这个属性又被称作原型链,指向构造当前函数的 prototype
1  | function Test() {  | 
当我们继续打印 Test.prototype.__proto__ 的时候会发现 Test 的构造函数是 Object,即
1  | console.log(Test.prototype.__proto__ === Object.prototype) // true  | 
这个时候就会发现有些特殊的事情,当我们在 Test 的 prototype 属性上添加一些属性或者 Object 的 prototype 上添加一些属性,这时通过 new 构造出来的实例能不能访问到这些属性或者方法呢,接下来让我们尝试一下
1  | function Test() {  | 
这是因为 使用 new 构造函数的时候,会自动继承构造函数上的所有方法及属性,当我们在访问实例的某个属性的时候,会现在实例对象上查找是否包含有这个属性,如果包含就直接返回,不包含的话就会在实例的原型链 __proto__ 上继续查找,如果仍未找到,则会继续通过 __proto__一级一级的向上查找,直到找到 原型链的最后一级 Object,如果仍未找到就返回 undefined
constructor
在实例的自身属性及 __proto__ 属性上有一个 contructor 属性,该属性指向 构造当前实例的 构造函数
1  | function Test() {  | 
判断是否包含属性
如何判断 实例的属性 是在实例自身身上还是在原型链上呢,这时候可以通过 Object.hasOwnProperty
1  | function Test() {  | 
属性 b 和 c 是挂载到 test 的原型链上的属性,并不属于 test 自身,所以通过 Object.hasOwnProperty 访问的时候返回为 false
特殊的原型 Object 和 Function
1  | Function.__proto__ === Function.prototype // true  | 
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
 Comment
DisqusValine








