constructor 和 prototype,顾名思义,是构造者(构造器)和原型的意思。

从语义的角度来看,对象 A 构造了对象 B,则 A 就是 B 的 constructor,如果对象 A 的形态来自对象 B,则对象 B 是 A 的原型。

看一段代码:

function Person() {
    Person.prototype.name = "myname";
    Person.prototype.age = 18;
    Person.prototype.sayName = function () { alert(this.name); };
}
var person1 = new Person();
person1.sayName();

这里 Person 就是 Person.prototype 的 constructor,为什么?因为 Person 构造了 Person.prototype。而 person1 的 prototype 不是 Person.prototype。在 person1 初始化时,可以理解成把 Person 拷贝了一份(就是 new 了一份)扔给 person1,而 Person 每 new 一次,都会从他的原形处继承(只是称为继承,方便理解)了一份 name,age,sayName。person1 是 copy 了 Person,但是 prototype 并没有 copy,所以说 person1 的 prototype 是 undefined。

这里 person1 很容易被理解成由 Person 构造,这样的话 person1.constructor 岂不成了 Person,现在就要区别一下构造和原形,构造,我们把它理解成从一个框架里建立一个对象,而原形,则是说对象的所有东西(数据)都要从原形继承过来。

再看一个函数:

function Person(name, age) {
    this.name = name;
    this.age = age;
    this.sayName = function() { alert(this.name); };
}
var person2 = new Person( "myname", 18 );
person2.sayName();

这里的 Person 和上面的 Person 想必相比,上面的 Person 不光构建了一个框架,而且填上了数据,而下面的 Person 只构建了框架,现在就很好区别 constructor 和 prototype 了,person1 从一个对象继承了数据和框架,而 person2 从一个对象只获取了结构(我们把这个过程理解成 Person 构建了 person2),那么 person2 的构造者自然就是 Person。

现在应该比较容易弄清 constructor 和 prototype 的意义了。

update1:

这里还有一个非常说明问题的例子:

var arrayTest = new Array();
alert(arrayTest.constructor); // 为Array

update2:

还有一个可能遇到的问题,先看代码: var person3 = new Person(); person3.prototype.name = “name3”;

上面的错误非常明显,person3 是 Person 的实例,不能为实例定义原型。