关于Js原型与原型链

Js原型与原型链

JavaScript 中,万物皆对象!凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。

JavaScript 中,每当定义一个对象时,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象

 关于Js原型与原型链

在上述示例中,原型对象就是 Person.prototype 我们给原型对象添加了四个属性:nameagejobsayName。其实它还有一个默认的属性:constructor

person1 person2都是Person的实例person1 person2其实并没有constructor 这个属性,这个属性是属于Person的原型对象的,只是person1 person2可以继承原型对象的constructor这个属性。

关于Js原型与原型链

所有的原型对象都会自动获得一个 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) // FunctionFunction.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 functionprototype

 

普通对象的__proto__指向这个对象(this)的构造函数的prototype

函数对象的__proto__全部都是指向Functionprototype


无论是Functionprototype还是构造函数的prototype都指向object.prototype,然后最终object.prototype指向null

 关于Js原型与原型链


实例(tidy)和 原型对象(dog.prototype)存在一个连接。不过,要明确的真正重要的一点就是,这个连接存在于实例(tidy)与构造函数的原型对象(dog.prototype)之间,而不是存在于实例(tidy)与构造函数(dog)之间。

 

实例继承原型对象的属性和方法,与构造函数无关,功能上讲prototype是给别人用的东西,而且给别人的东西自己不能用,__proto__是借用别人的东西。