我正在研究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在解析时被定义了?谢谢你的帮助。
答案 0 :(得分:3)
区别在于PersonOne
已分配匿名函数表达式的结果。命名变量只是该函数的别名,但构造函数本身没有.name
属性。
如果您已声明它:
var PersonOne = function MyPersonOne() {};
然后创建为new PersonOne
的对象原型为MyPersonOne
。
这很重要 - 它确保您不能仅通过为构造函数创建别名来创建任意“类型”的对象。对象的“类型”必须与构造函数的(实际)名称相同。