以前每件事都差很少,直到如今才发现差不少。如今才发现理清一件事的原委是多么快乐的一件事,咱们共同勉励。javascript
懒得扯淡,直接正题java
不基于例子的讲原理都是扯淡,知乎同样的举例都是卖弄函数
function A () { }; A.prototype = { }; function B () { }; var a = new A(); B.prototype = new A(); var b = new B(); console.log(a.constructor); //Object console.log(A.constructor); //Function console.log(a.hasOwnProperty('constructor')); // false console.log(A.hasOwnProperty('constructor')); // false console.log(a instanceof A); // true console.log(b.constructor); // Object console.log(B.constructor); // Function console.log(b.hasOwnProperty('constructor')); // false console.log(B.hasOwnProperty('constructor')); // false console.log(b instanceof B); // true console.log(b instanceof A); // true
console.log(a.constructor); //Object console.log(A.constructor); //Function console.log(b.constructor); // Object console.log(B.constructor); // Function
首先须要明确 constructor 属性是 Object.prototype 对象上的, Object.prototype.hasOwnProperty('constructor') === true,而实例对象上的 constructor 属性是从其原型链中取。spa
object instanceof constructor # 参数 - object 检测的对象 - constructor 构造函数
检测 constructor.prototype 是否存在于object的原型链上prototype
# 此处为文章前面的例子,只是把对于 instanceof 的判断集中起来 console.log(a instanceof A); // true console.log(b instanceof B); // true console.log(b instanceof A); // true
看 MDN instanceof有下面的例子(精简化)code
function C(){} var o = new C(); o instanceof C; // true,由于 Object.getPrototypeOf(o) === C.prototype o instanceof Object; // true,由于Object.prototype.isPrototypeOf(o)返回true C.prototype instanceof Object // true,同上 C.prototype = {}; var o2 = new C(); o2 instanceof C; // true o instanceof C; // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.
乍一看,上面的例子,始终对于最后 o instanceof C 返回 false 不理解,其实只要明白 object.__proto__ 和 Constructor.prototype 是两个引用值,在使用 Constructor 建立实例 object 时, object.__proto__ === Constructor.prototype,以后 object.__proto__ 改变和 Constructor.prototype 任意其一改变都会致使最后 object.__proto__ !== Constructor.prototype对象
console.log(a.hasOwnProperty('constructor')); // false console.log(A.hasOwnProperty('constructor')); // false console.log(b.hasOwnProperty('constructor')); // false console.log(B.hasOwnProperty('constructor')); // false
constructor 属性是从原型对象上继承的blog
MDN instanceof
MDN constructor
MDN hasOwnProperty
MDN Prototype继承