原型+原型链
prototype
是函数特有的属性,__proto__
是每个对象都有的属性,而prototype
本身也是一个对象当我们去获取
a.name
的时候,会先从对象的自身属性开始查找,如果没有的话,就会从a.__proto__
上找对象
a.__proto__
又指向构造器函数test
的prototype
(原型),所以从a.__proto
上找属性其实就是在test.prototype
找属性,但是prototype
(原型)本身又是一个对象, 这样的话,会重复上面两个步骤,最终都是找到了Object
这个构造器函数,而Object.__proto
是一个null
值,如果中间有值就返回,没有就赋值undefined
。
这样的链式结构就是原型链
因为构造器函数原型上的constructor是指向构造器函数自身的,所以
1a.constructor === test; // true2a.__proto__ === test.prototype //true3a.__proto__.constructor === test; // true4a.__proto__.constructor === test.prototype.constructor; // true5test.prototype.constructor === test //true6// 函数(包括原生构造函数)的原型对象为Function.prototype7test.__proto__ === Function.prototype // true
函数都是由 Function 原生构造函数创建的,所以函数的 proto 属性指向 Function 的 prototype 属性。
测试
1function test() {}2test.prototype.then = function () {3 console.log("test => then");4};5Function.prototype.mythen = function () {6 console.log("Function => mythen");7};8test.mythen();9test.then();