Prototype到底是什么

对象的prototype

概念:JavaScript的对象都有一个特殊的属性[[Prototype]]内置属性,其实就是对于其他对象的引用

那我现在有个对象a,我如何找到他的prototype?

对象a的prototype就是对其构造函数的prototype的引用 那我直接 a = {}呢?

相当于 a = new Object(),构造函数是Object; 不过prototype明明是每个对象的内置属性,通过别的地方调用或者是方法访问好像有点蠢,有没有什么直接的get方法吗?

巧了,又全等,合着这些东西都是同一个对象,除了构造函数有prototype,其他都没有都是抄的 那除了引用构造函数的prototype我还有其他方法获得prototype吗?

所以通俗说的对象的prototype其实不存在这个属性,对象只有__proto__属性,值为构造函数prototype的引用

函数的prototype

所有函数默认都会拥有一个名为prototype的公有并且不可枚举的属性 真的是所有吗?

我随便写了个空函数都有prototype属性,看来是都有了,但是这里有一处问题,prototype是所有构造函数才有的属性,所以我必须写个构造函数才不容易让人产生误解

在js中构造函数作为一个伪造”类“的方式,除了首字母大写没有任何区别了,任何函数前面加个new都能构造对象,只是有的构造出来是个空对象 那对象中的[[Prototype]]属性与他的构造函数是怎么创造联系的呢?

obj是用Test构造的一个对象,在new的过程中,将Test.prototype的引用放到obj.__proto__中,我们用obj.b来获取属性b时,顺势找到了__proto__中的b。之后我们修改Test.prototype的引用,让他指向新的对象{c:1}。我们再通过obj.c访问c时是访问不到的,因为obj.__proto__中的引用始终是构造时的Test.prototype。

调用new Test()创建a时,会将object内部的[[Prototype]]链接到Foo.prototye所指向的对象上

Object.defineProperties(Object.prototype, "__proto__" ,{
	get(){
		return Object.getPrototypeOf(this);
	},
	set(o){
		Object.setPrototypeOf(this,o);
		return o;
	}
})
复制代码

众所周知的是,我们在试图引用一个对象的属性时,第一步是检查他有没有这个属性,如果没有,则查找到这个对象内部的prototype的引用,然后一直查找下去直到Object.prototype为止,为什么找到这里就为止了呢?

b.__proto__ === a
a.__proto__ === Object.prototype
Object.prototype.__proto__ === null
复制代码

对象找属性,可以说是沿着__proto__向上找了,可以看到这里从b找到了a,再找到了Object.prototype,最后就找空了

以上总结一句话

所有的对象都有一个__proto__属性,所有的构造函数都有一个prototype属性,他俩相等。 可是构造函数是一种对象,对象的构造需要构造函数。 很拗口的一句话,因为函数是个特殊的对象 现在我们来研究一下这个既有__proto__属性又有prototype的构造函数对象

所有的构造函数作为对象都继承自Function这个类,所以他们的内部prototype属性就指向Function.prototype,那Function自己呢?

也是一样,那Object呢?

也是一样

Function instanceof Object
//true
Object instanceof Function
//true
Array instanceof Function
//true
复制代码

所以会出现这种相互继承的情况,Function作为对象继承自Object,Object作为构造函数继承自Function

琐事

科比退役了,挂了两件球衣在斯台普斯,感觉像青春落幕后被挂起来了。以前放学就打球,看到人家一双科三馋得流口水,生日礼物最想要科比八号复古球衣。现在俨然一个油腻的中年男子,肚子坐出三层肉,也不打球了。他们说是因为找不回以前打球的人了,我觉得我是找不回以前那个打球的自己了

转载于:https://juejin.im/post/5a3c8b09518825696f7e3010

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值