具有不同原型混淆的Javascript对象构造函数

时间:2013-04-03 10:04:52

标签: javascript constructor prototype

我正在研究Javascript对象和原型,据我所知,定义构造函数的两种方法最终得到了类似的结果。

例如,在此代码中,相同的构造函数以两种不同的方式定义,但它们最终具有不同的原型值:

var PersonOne = function () {};

function PersonTwo(){};

var p1 = new PersonOne();
var p2 = new PersonTwo();

console.log(p1.constructor.prototype);
console.log(p2.constructor.prototype);

结果:

Object {}
PersonTwo {}

显然我错了,在PersonOne中定义构造函数会导致构造函数的原型是Object。这会影响继承。但问题是,这种不同结果的原因是什么?

我认为问题可能是由于PersonOne函数在运行时被定义而PersonTwo在解析时被定义了?谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

区别在于PersonOne已分配匿名函数表达式的结果。命名变量只是该函数的别名,但构造函数本身没有.name属性。

如果您已声明它:

var PersonOne = function MyPersonOne() {};

然后创建为new PersonOne的对象原型为MyPersonOne

这很重要 - 它确保您不能仅通过为构造函数创建别名来创建任意“类型”的对象。对象的“类型”必须与构造函数的(实际)名称相同。