原型链观点
每一个组织函数内部都邑有一个(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__ 构成的,它在个中的作用属于衔接的线