1、构造函数:
【1】构造函数和普通函数的唯一区别,在于调用方式不同。任何函数只要通过new操作符来调用,那就是构造函数;任何函数只要不通过new操作符来调用,那就是普通函数。
【2】任何函数都有prototype属性(函数也是对象),该属性指向函数原型。
原型上有一个不可枚举的constructor属性:指向该函数;还有一个[[Prototype]]指针,指向原型链的上一级。没有标准的方式访问[[Prototype]],但Firefox、Safari、Chrome都用__proto__来表示。
constructor: ƒ Person()
__proto__: Object
【3】在理解原型时,我们把构造函数当做对象来看待
构造函数的prototype属性指向原型,原型的constructor属性指向构造函数。
new操作符构建的实例对象[[prototype]]指向原型,继承原型。
function foo(){
console.log(1)
}
console.log(foo);
console.log(foo.prototype);
2、原型链
3、isPrototypeOf 判断是不是在foo对象的原型链上。
function Foo() {}
function Bar() {}
function Baz() {}
Bar.prototype = Object.create(Foo.prototype);// Bar.prototype ——> Foo.prototype ——> Object.prototype
Baz.prototype = Object.create(Bar.prototype);// Baz.prototype ——> Bar.prototype ——> Foo.prototype ——> Object.prototype
var foo = new Foo();
var bar = new Bar();
var baz = new Baz();
//是在该对象的原型链上
console.log(Baz.prototype.isPrototypeOf(foo)); // false
console.log(Bar.prototype.isPrototypeOf(foo)); // false
console.log(Foo.prototype.isPrototypeOf(foo)); // true
console.log(Object.prototype.isPrototypeOf(foo)); // true