Featured image of post __Proto__与prototype

__Proto__与prototype

之前也有看过资料,当时觉得明白了,但是时间一久就忘记了,一方面是平时工作中没有使用,另一方面是只是看,没有自己去思考,所以这次决定自己理一理。

首先看几个概念

1、__proto__原型对象

对象的__proto__指向创建它的构造函数的prototype,当你调用该对象的属性的时候,如果它自身没有这个属性,它会去__proto__上找这个属性

2、prototype

只有函数才有prototype属性,当你创建一个函数的时候,JS 会为这个函数添加prototype属性,值是一个有constructor属性的对象,(对象两个字很关键,这意味着这个对象也有__proto__属性,它指向创建它的构造函数即Objectprototype。)

接下来看看代码

function A() {}

var a = new A();

console.log(A.__proto__ === Function.prototype); // true

console.log(a.__proto__ === A.prototype); // true

console.log(a.__proto__.__proto__ === Object.prototype); // true

然后同理我觉得下边的也应该成立

console.log(Object.prototype.__proto__ === Object.prototype); // false

但是事实很不幸,得到的是 false.

console.log(Object.prototype.__proto__); // null

打印一看是 null,然后再想想,其实 js 就是这样设计的而已,要不这个原型链不得没完没了了嘛,你想想有个对象找一个属性,它找到Object.prototype就应该到头了,要不它就会一直找下去,无尽循环。

然后我们看一个问题,就是FunctionObject的问题

console.log(Object.__proto__ === Function.prototype); // true

console.log(Function.__proto__ === Function.prototype); // true

可以看出Object是由Function构造出来的,而Function是由Function自己构造出来的,这个听起来好奇怪,自己构造自己。

constructor

下面再看看prototype.constructor

function A() {}

var a = new A();

console.log(A.prototype.constructor === A); // true

函数的prototype.constructor指向了自己,除此之外,我目前还没发现这个有什么用。

function A() {}

var a = new A();

console.log(A.prototype.constructor === A); // true

console.log(a.constructor === A); // true

找到一个说法

constructor属性不影响任何JavaScript的内部属性。instanceof检测对象的原型链,通常你是无法修改的(不过某些引擎通过私有的__proto__属性暴露出来)。constructor其实没有什么用处,只是JavaScript语言设计的历史遗留物。由于constructor属性是可以变更的,所以未必真的指向对象的构造函数,只是一个提示。不过,从编程习惯上,我们应该尽量让对象的constructor指向其构造函数,以维持这个惯例。

作者:贺师俊
链接:https://www.zhihu.com/question/19951896/answer/13457869
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Licensed under CC BY-NC-SA 4.0