js 的原型 (简单快速理解原型链)

/**
 * 1.原型对象  XXX.prototype
 * 2.构造函数的原型对象获取  XXX.__proto__;
 * 3.使用 函数的方法或属性时,先从自身函数查找,找不到就像上查找  XXX.__proto__,找不到再往上找,直到 XXX.__proto__.__proto____proto__ ...   === nul * l ,如果还找不到,就返回undefined
 * 4.本质上来说 普通函数也是 构造函数
 */

//首先写一个构造函数
function Fun(name){this.name =  name};

//new出来 一个对象(Object  {}) 注意,new出来的,只是一个对象,不是函数
let func = new Fun("尊龙");


//prototype是函数独有的,__proto__是对象独有的,但是JS万物皆对象,所以函数里面也有__proto__;
//func对象的__proto__ 等于 func的构造函数(Fun)的原型对象 所以
console.log(func.__proto__===Fun.prototype); //true
//func的构造函数(Fun)的原型对象  里面包含所有实例共享的属性和方法 比如 name='尊龙'
console.log(Fun.prototype);//{constructor: ƒ}

//构造函数(Fun)的__proto__  等于 自己的构造函数  (Function)的原型对象
console.log(Fun.__proto__);//ƒ () { [native code] }

//所以Function的原型对象    等于   构造函数(Fun)的构造函数(Function)的原型对象
console.log(Function.prototype === Fun.__proto__)//true

//Function的构造函数是自己,所以    Function的构造函数的原型对象   是   (Function)本身的原型对象
console.log(Function.__proto__)//ƒ () { [native code] }
console.log(Function.__proto__ === Function.prototype);//true

//由于万物皆对象,Function的原型对象也是对象,  既然是对象,那么对象的构造函数的原型对象自然就是Object的原型对象
console.log(Function.prototype.__proto__);//{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
//验证了上一条观点  Function的原型对象的构造函数的原型对象  就是对象的原型对象
console.log(Function.prototype.__proto__ === Object.prototype);//true

//因为对象也是可以 new出来的  比如  let obj = new Object();  所以本质上对象的构造函数是Function,所以对象的构造函数的原型对象,就是Function的原型对象
console.log(Object.__proto__)//ƒ () { [native code] }

//对象的原型对象的构造函数的原型对象已经没有了  所以是null   
console.log(Object.prototype.__proto__);//null

//顶层对象实例,同时也是原型链的祖宗
console.log(Object.prototype)  //{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值