小白有点分不太清楚。
构造函数中,有个__proto__属性,里面指向的是原型。那么是不是就说明原型是存在于构造函数中的,属于构造函数的一个属性?
还是说,prototype原型不是属于构造函数的,而__proto__只是指路人而已?
小白有点分不太清楚。
构造函数中,有个__proto__属性,里面指向的是原型。那么是不是就说明原型是存在于构造函数中的,属于构造函数的一个属性?
还是说,prototype原型不是属于构造函数的,而__proto__只是指路人而已?
当你定义一个(构造)函数的时候,伴随这这个函数的定义,这个函数自然具有一个prototype
属性,这个属性指向一个对象,我们把它称作函数的原型对象吧,这个原型对象中有一个属性constructor
指向了这个函数。
可以认为定义构造函数<F>
的同时也生成了一个对象<O>
,构造函数<F>
用prototype
属性指向<O>
,<O>
用constructor
属性指向<F>
,它们就绑在了一起。
function F(){};
console.log(F === F.prototype.constructor); // true
上面说的和__proto__
还没有关系,它是在用构造函数生成的实例上的。当我们用构造函数生成一个实例时<R>
,这个实例有一个属性__proto__
指向了那个原型对象<O>
。
var R = new F();
console.log(R.__proto__ === F.prototype); // true
现在我们来看构造函数<F>
、原型对象<O>
、实例对象<R>
: <F>
用prototype
属性指向<O>
, <R>
用__proto__
属性指向<O>
, 而<O>
用constructor
属性指向<F>
。如果你画个图就更清晰了。
另外说以下,要通过实例对象来获得它的原型对象,__proto__
并太好,由于浏览器大多支持,因此es6
中也写入了标准,但是从它的写法就看出它更多地是一个内部的属性,实际代码中可以用Object.getPrototypeOf()
方法,传入一个实例对象,就可以获得它的原型对象。
原型:prototype:保存所有子对象共有属性值的父对象
每个(构造)函数都自带一个prototype对象
所有被构造函数创建的子对象都有一个proto属性指向构造函数的prototype对象。
这里的proto及portotype都只是一个引用
13 回答12.9k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
6 回答942 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
首先,构造函数的自有属性里,没有
__proto__
属性,你看到的可能是构造函数的原型链加粗文字上的,或者是实例的__proto__
属性;其次,构造函数中访问它对应的原型对象,用
prototype
属性,原型对象上有constructor
属性指向构造函数,构造函数和原型对象互相关联;prototype
是存在于构造函数中的,属于构造函数的一个属性。原型是一个对象,构造函数的prototype
指向这个对象。指路人说法不准确,
prototype
仅仅是构造函数的属性,是一个引用,指向内存里的prototype
对象;__proto__
在实例上,作为实例的属性,是一个引用,指向内存里的prototype
对象题外话
1、
__proto__
不建议使用,可以用Object.getPrototypeOf()
和Object.setPrototypeOf()
代替;2、原型建议看经典书籍吧,书上说的严谨清楚些;
3、你的基本概念有些混乱,还是看经典书籍吧
JavaScript权威指南-第6版-中
JavaScript高级程序设计-第3版-中