-
任何对象都拥有
__proto__
隐式原型属性,一般指向他们的构造函数的原型
prototype
function 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
-
Object
Function
Array
本身也都是一个函数,由于是最常用的,所以
JavaScript
帮我们实现了内置对象的
__proto__
===Function
的prototype
console.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 === Function
function 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)