如何理解"构造函数是类公共标识,但原型是唯一的标识"
区分这两个标识
公共标识:
从某种意义来说,定义构造函数就是定义类
唯一标识:
我们常常通过instanceof关键字检查某个对象是否属于某个类。但是instanceof方法实际上检查是对象的继承关系而非检测创建对象的构造函数;
例如:obj instanceof ClassA; 我们会容易错误的认为:该方法检测是obj对象是否由ClassA创建;
错误的认为如果返回true,则表示obj 是由ClassA创建;
这里我可以举一个示例代码:
即使obj 由 ClassA创建出来的,他也会有返回false的情况;这就会推翻我们前面错误的认识;
var ClassA = function(){console.log("ClassA create")};
var obj = new ClassA();
ClassA.prototype = {another:"anotherClass"};
obj instanceof ClassA //结果为:false
instanceof 关键字 实质对比的是该对象是否包含右侧构造函数的原型,如果包含则返回 true;
那么我们有没有更好的替代方法,而不通过构造函数这个中介来判断呢?
当然有!!!我们也可以通过isProtorypeOf()方法来判断某个对象是否包含某个原型对象;
例如:Object.prototype.isPrototypeOf(obj);
个人理解可以翻译成:Object.prototype是否在obj的原型链上?
使用isPrototypeOf()方法的好处是更直接体现了"构造函数是类公共标识,但原型是唯一的标识"这句话,不会有理解上的歧义;