-
任何对象都拥有
__proto__隐式原型属性,一般指向他们的构造函数的原型
prototypefunction People(name) { this.name = name } People.prototype.outputName = function () { console.log('My name is ' + this.name) } var Jack = new People('Jack') Jack.outputName() console.log(Jack.__proto__ === People.prototype) // My name is Jack console.log(Array.prototype.__proto__ === Object.prototype) // true -
原型链的顶端是
Object.prototype,其__proto__为 null,也就是说
Object.prototype在想沿着原型链进行查找是不中的,因为
Object.prototype已经是原型链的尽头了console.log(Object.prototype.__proto__ === null) // true -
所有函数都拥有
prototype(显式原型)属性function Music(musicType) { this.musicType = musicType } console.log(Music.prototype) console.log(Array.prototype) -
所有函数都是
Function的实例function foo() {} console.log(foo instanceof Function) // true console.log(foo.proto === Function.prototype) // true类似的 就十分容易就能理解
var obj = {} var arr = [] console.log(obj.proto === Object.prototype) // true console.log(arr.proto === Array.prototype) // true -
ObjectFunctionArray本身也都是一个函数,由于是最常用的,所以
JavaScript帮我们实现了内置对象的
__proto__===Function的prototypeconsole.log(Function.__proto__ === Function.prototype) // true console.log(Array.__proto__ === Function.prototype) // true console.log(Object.__proto__ === Function.prototype) // true console.log(Date.__proto__ === Function.prototype) // true console.log(String.__proto__ === Function.prototype) // true console.log(Boolean.__proto__ === Function.prototype) // true console.log(Number.__proto__ === Function.prototype) // true console.log(RegExp.__proto__ === Function.prototype) // true console.log(Error.__proto__ === Function.prototype) // true -
原型对象中拥有
constructor属性, 该属性指向函数本身console.log(Object.prototype.constructor === Object) // true console.log(Array.prototype.constructor === Array) // true console.log(Number.prototype.constructor === Number) // true -
原型链概念
如果想要找到一个对象的属性,首先会先在自身查找,如果没有,就会通过proto属性一层层的向上查找,
直到原型链的顶端
Object.prototype(__proto__: null)这种通过某种纽带
__proto__将对象之间形成一种继承关系这种关系呈现出一种链条的形状 将这种链条称之为原型链
-
由于构造函数
Fun本身没有constructor属性所以构造函数
Fun通过__proto__属性,沿着原型链向上找到了Fun.__proto__而
Fucntion又是一切函数的构造函数所以Funciton.prototype === Fun.__proto__于是可以得出
Fun.__proto__.constructor === Functionfunction Fun() {} console.log(Fun.constructor === Function) console.log(Array.constructor === Function) console.log(String.constructor === Function) -
由于
Function也会是自己本身的构造函数所以
Function.prototype === Function.__proto__console.log(Function.proto.proto === Object.prototype) console.log(Function.prototype.proto === Object.prototype)