原型链

原型链观点

每一个组织函数内部都邑有一个(constructor,prototype原型对象),而且都邑有一个内置树形__proto__属性用于指向建立它函数对象的prototype原型,固然原型对象也会有__proto__属性,络绎不绝的指向关联,就构成了一个圆环,构成了原型链

原型prototype对象

函数对象

function f() {
}
console.log(f.prototype)

《原型链》
我们建立了一个函数f,经由过程打印它的原型对象,我们会获得一个对象,内里包括一个constructor指向自身自身的指针,另有一个内置__proto__属性

console.log(f.prototype.__proto__)

《原型链》
那我们再看看它的内置属性指向了那里,我们能够很清晰的看到constructor指向了Object,而它还内置了toString()和valueOf()要领,这到了那里已不必我多说了吧

console.log(f.prototype.__proto__.__proto__)

那我们再继续寻觅往下找呢,我们会获得null,此能够得出结论,请看下面图解

《原型链》

一般对象

let obj = {}
console.log(obj.prototype) // undefined

固然一般对象是没有原型对象的

作用

原型链就是为了完成继续

例子

function Father() {
    this.name = 'aaa'
}

Father.prototype.f1 = function () {
    alert(this.name)
}

// 子函数 继续父
function Son(name) {
    Father.call(this, name)
}

// 我以为继续父
Son.prototype = Object.create(Father.prototype)

// minix 继续多种 Object.assign(1,2,3)
Son.prototype.constructer = Son   //组织器指向

// 重写父要领,转变数据变化,而且不会掩盖父要领,这里称为多态
Son.prototype.f1 = function () {
    console.log(this.name)
}

var S1 = new Son()
S1.f1() // 挪用 aaa

搜检原型和实例的关联

第一种运用 instanceof 操作符
    console.log(S1 instanceof Object)//true
    console.log(S1 instanceof Father)//true
    console.log(S1 instanceof Son)//true
    
上面检测S1这个实例是不是属于Object,Father,Son,效果都返回了true,有些小伙伴会疑问为何我new的是Son,它还会属于Father,因为Son.prototype = Object.create(Father.prototype)这段代码已将父的原型给了子了,而且又constructer指向了子函数,这相当于已继续胜利




第二种运用isPrototypeOf

作用:检测一个对象是不是是另一个对象的原型。或者说一个对象是不是被包括在另一个对象的原型链中

    console.log(Object.prototype.isPrototypeOf(S1))  //true
    console.log(Father.prototype.isPrototypeOf(S1))  //true
    console.log(Son.prototype.isPrototypeOf(S1))   //true
    

查找

Function.__proto__ === Function.prototype

每一个函数声明以后都邑天生一个函数对象,这正如我们说的那样函数的__proto__是指向它自身的原型的

Function.prototype.__proto__  === Object.prototype

函数原型再向上查找是什么,它们直接经由过程什么衔接,固然是__proto__,它指向的则是Object.prototype

Object.prototype.__proto__  === null

然后再去查找Object.prototype,它会即是null,因为已抵达最底层了,这个记着就好

constructor属性

constructor属性不影响任何JavaScript的内部属性。
instanceof检测对象的原型链,一般你是没法修正的

constructor实在没有什么用途,只是JavaScript言语设想的汗青遗留物。
因为constructor属性是能够变动的,所以未必真的指向对象的组织函数,
只是一个提醒。不过,从编程习惯上,我们应当只管让对象的constructor指向其组织函数,以保持这个通例

总结

原型和原型链是JS完成继续的一种模子

原型链是靠__proto__ 构成的,它在个中的作用属于衔接的线

    原文作者:me_zhazha
    原文地址: https://segmentfault.com/a/1190000018633649
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞