请问js原型是存在于构造函数中吗?

小白有点分不太清楚。

构造函数中,有个__proto__属性,里面指向的是原型。那么是不是就说明原型是存在于构造函数中的,属于构造函数的一个属性?

还是说,prototype原型不是属于构造函数的,而__proto__只是指路人而已?

阅读 2.4k
4 个回答
构造函数中,有个__proto__属性,里面指向的是原型。

首先,构造函数的自有属性里,没有 __proto__ 属性,你看到的可能是构造函数的原型链加粗文字上的,或者是实例__proto__ 属性;

其次,构造函数中访问它对应的原型对象,用 prototype 属性,原型对象上有 constructor 属性指向构造函数,构造函数和原型对象互相关联;

那么是不是就说明原型是存在于构造函数中的,属于构造函数的一个属性?

prototype 是存在于构造函数中的,属于构造函数的一个属性。原型是一个对象,构造函数的prototype指向这个对象。

还是说,prototype原型不是属于构造函数的,而__proto__只是指路人而已?

指路人说法不准确,prototype 仅仅是构造函数的属性,是一个引用,指向内存里的 prototype 对象;__proto__ 在实例上,作为实例的属性,是一个引用,指向内存里的 prototype 对象

题外话

1、__proto__ 不建议使用,可以用 Object.getPrototypeOf()Object.setPrototypeOf() 代替;

2、原型建议看经典书籍吧,书上说的严谨清楚些;

3、你的基本概念有些混乱,还是看经典书籍吧

JavaScript权威指南-第6版-中
JavaScript高级程序设计-第3版-中

当你定义一个(构造)函数的时候,伴随这这个函数的定义,这个函数自然具有一个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>。如果你画个图就更清晰了。
《javascript高级程序设计》中一个图
另外说以下,要通过实例对象来获得它的原型对象,__proto__并太好,由于浏览器大多支持,因此es6中也写入了标准,但是从它的写法就看出它更多地是一个内部的属性,实际代码中可以用Object.getPrototypeOf()方法,传入一个实例对象,就可以获得它的原型对象。

构造函数中的__proto__属性,指向的是原型啊.
这个属性指向的其实是一个内存地址.
说原型存在构造函数中并不太准确.

原型:prototype:保存所有子对象共有属性值的父对象

每个(构造)函数都自带一个prototype对象

所有被构造函数创建的子对象都有一个proto属性指向构造函数的prototype对象。

这里的proto及portotype都只是一个引用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题