这个对象属于哪个类?

javascript还没有支持Class关键字.但是使用js的原型继承机制可以模拟类似java中的类.

如下,创建了一个Car类并创建了一个此类的实例myCar

代码一:


function Car() {
}

var myCar = new Car();

然后给Car类添加一个start()方法,实现方式就是在Car的prototype属性上增加start方法.

代码二:


Car.prototype.start = function () {
		console.log('starting');	
	}
};

还有另外一种写法:

代码三:


Car.prototype = {
	constructor: Car,
	start: function () {
		console.log('starting');	
	}
};

因为每个新创建的函数对象都会有一个默认的prototype属性,这个属性上会默认有一个constructor属性,这个constructor就是对此函数的引用.在代码一中添加如下代码,可验证这种说法:


Car.prototype.constructor === Car; // true

代码三其实是使Car的prototype属性引用了一个新创建的对象.并在这个新的prototype中添加了引用Car函数constructor属性.据我的经验,如果不指定constructor这个属性的话,也不会对类的定义有影响.这个constructor没用吗?!引用大犀牛书中的一段话:

构造函数的原型中存在预先定义好的constructor属性,这意味着对象通常继承的constructor均指代他们的构造函数.由于构造函数是类的”公共标识”,因此这个constructor属性为对象提供了类.

怎样说明这个属性还有点用呢? instanceOf 运算符可以检测一个对象时候是某个类的实例,比如有一个 obj 对象,可以这样检测它时候是Car类的实例.


obj instanceOf Car;

但是,怎样能直接知道某个对象是哪个类的实例呢?,而不是判断它是不是某个类的实例.就像说,”我不想知道这种动物是不是兔子,我想知道它到底是什么动物”.这时constructor就有用了.


obj.constructor.name;

这样就取到了对象obj的构造函数的函数名,也就是类的”公共标识”,如果这时这个constructor是缺失的话,就无从得知了.所以应该保证constructor的正确设置.