Js原型与原型链
JavaScript 中,万物皆对象!凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。
在 JavaScript 中,每当定义一个对象时,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象。
在上述示例中,原型对象就是 Person.prototype ,我们给原型对象添加了四个属性:name、age、job、sayName。其实它还有一个默认的属性:constructor。
person1和 person2都是Person的实例,person1 和 person2其实并没有constructor 这个属性,这个属性是属于Person的原型对象的,只是person1 和 person2可以继承原型对象的constructor这个属性。
所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)
Person.prototype.constructor == Person
每个对象都有 __proto__ 属性,但只有函数对象才有 prototype 属性
function Person(){};
console.log(Person.prototype) //Person{}
console.log(typeof Person.prototype) //Object
console.log(typeof Function.prototype) // Function,Function.prototype是函数对象
console.log(typeof Object.prototype) // Object
console.log(typeof Function.prototype.prototype) //undefined
所有对象的 __proto__ 都指向创建它的构造函数的原型对象xx.prototype
对象 person1 有一个 __proto__属性,创建它的构造函数是 Person,构造函数的原型对象是 Person.prototype ,所以:
person1.__proto__ == Person.prototype
特殊:
Object.prototype.__proto__ === null
Object.prototype 对象也有proto属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。
所有函数对象的proto都指向Function.prototype,它是一个空函数(Empty function)
Function.prototype也是唯一一个typeof XXX.prototype为 function的prototype
普通对象的__proto__指向这个对象(this)的构造函数的prototype;
函数对象的__proto__全部都是指向Function的prototype。
无论是Function的prototype还是构造函数的prototype都指向object.prototype,然后最终object.prototype指向null
实例(tidy)和 原型对象(dog.prototype)存在一个连接。不过,要明确的真正重要的一点就是,这个连接存在于实例(tidy)与构造函数的原型对象(dog.prototype)之间,而不是存在于实例(tidy)与构造函数(dog)之间。
实例继承原型对象的属性和方法,与构造函数无关,功能上讲prototype是给别人用的东西,而且给别人的东西自己不能用,__proto__是借用别人的东西。