JS中有两个特殊的对象:Object与Function,它们都是构造函数,用于生成对象。
Object.prototype是所有对象的祖先,Function.prototype是所有函数的原型,包括构造函数。
可以将JS的对象分为三类:用户创建对象,构造函数对象,原型对象。
所有对象中都有一个__proto__属性,其指向此对象的原型。
构造函数对象有prototype,指向其原型对象,通过此构造函数创建对象时,新创建对象的__proto__属性将会指向构造函数的prototype属性。
function Person(){}; var person=new Person(); console.log(person.__proto__) // Person {} console.log(Person.prototype) // Person {}
原型对象有一个constructor属性,指向它对应的构造函数。
console.log(person.constructor) //function Person(){}
每个构造函数都有一个prototype属性,这个属性是一个指针,指向一个prototype对象,它是显示修改对象的圆形的属性
prototype 不能用在实例上,否则会编译错误
每个prototype对象都有一个constuctor属性,这个constructor属性同样指向一个constructor对象,而这个constructor对象恰恰就是这个function函数本身
function Person(){}; var person=new Person(); console.log(person instanceof Person) //true person 是否是Person的实例 console.log(Person instanceof Function) //true Person 是否是 Function的实例 console.log(Person.prototype == person.__proto__) //true console.log(Function.__proto__) //function Empty(){} console.log(Function.prototype) //function Empty(){} console.log(Object.__proto__) //function Empty(){} console.log(Object.prototype) //Object {} console.log(Array.__proto__) //function Empty(){} console.log(Array.prototype) //[Symbol(Symbol.unscopables): Object] console.log(person.__proto__) //Person {} console.log(Person.prototype) //Person {} console.log(person.constructor) //function Person(){}
function Person() {} var p1 = new Person(); console.log(Person.prototype) //Person {} 每个构造函数都有一个prototype属性,指向一个prototype对象 console.log(p1.constructor) //function Person(){} 原型对象有一个constructor属性,指向它对应的构造函数。 console.log(p1 instanceof Person) //true p1 是否是Person的实例