构造函数和原型的关系
构造函数的作用
构造函数的主要作用是用于生成对象。
有其他面向对象语言开发经验的同学可能会觉得使用 new 运算符的语法和创建类的示例很像,其实本质是不一样的。
结合原型的特性,在 JavaScript 中也能实现类似于类的一套机制。
首先看一段代码:
function Point(x, y) { this.x = x; this.y = y; } var point = new Point(1, 2); console.log(point.__proto__);

这样打印出来的 point 的原型对象,除了 constructor 和 __proto__ 属性,就什么都没有了。
接下来做个改写:
function Point(x, y) { this.x = x; this.y = y; } Point.prototype.info = function() { console.log('x: ' + this.x + ', y: ' + this.y); }; var point = new Point(1, 2); point.info(); // 输出:"x: 1, y: 2" console.log(point.__proto__);

这样输出的 point 的原型对象,就具有了一个 info 方法。
从这就可以看出对象的原型,和他的构造函数的 prototype 属性是有关的。
所有函数都具有一个 prototype 属性,翻译过来也是 原型的意思。
当一个函数作为构造函数被调用的时候,就会把这个函数的 prototype 属性,作为构造函数生成的对象的原型。
使用相等运算符,就可以验证上面这个规则:
console.log( point.__proto__ === Point.prototype, ); // 输出:true
这就是一个对象原型的由来。
如果要知道对象由哪个构造函数生成,可以从 constructor 属性获取到,原型对象的 constructor 属性则指向这个原型所处的函数。

浙公网安备 33010602011771号