原型对象
一:原型 prototype
1.定义
每一个函数身上都有一个prototype(原型),由于这个prototype的值是一个对象类型,因而又叫做原型对象,ptototype属性是函数独有的属性!
2.原型的作用
原型对象的作用通常用来共享父类的方法,由于方法是函数,本质上也是一个对象,而对象的内存地址保存在堆空间里,如同工厂模式一般,多个内存空间存放相同的代码,会造成大量空间被占用,因而将公有的方法添加在父类的prototype上,也就是写入了同一对象上,调用的时候也就避免了多个空间存放同一代码的错误示范,而由于父类的属性的值是基本类型,所占内存较少,所以我们往往将其添加到父类函数体的内部。
我们创建的每一个函数,解析器都会像函数中添加一个属性 prototype ,无论构造函数还是普通函数
二:proto
与函数的prototype属性不同,每一个obj的对象都有一个__ptoto__属性,这个__proto__属性隐式的指向了这个子类的的构造函数的prototype属性!但是这个__proto__属性是不可见的,这也就是为什么将其称作是隐式的,不过好在浏览器的支持下,它被定义为__proto__
如果看到这里,希望你再好好思考一下 ”万物皆对象“这句话的含义
从父类的角度看,子类的_proto_属性隐式指向了它的父类的prototype对象;从子类的角度看,子类自身的__proto__属性指向了它的父类的prototype属性
构造函数的prototype属性指向的 与 实例化对象的__proto__属性指向的 是同一个对象,也就是父类的prototype对象!
prototype
这个属性对应一个原型对象,这个对象就是我们所谓的原型对象
如果函数作为普通函数调用,则此属性没有任何作用
当函数作为构造函数的形式调用时,他所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过_proto_来访问该属性
function Person() {
}
var per = new Person();
console.log( typeof Person.prototype);object
console.log(typeof per.__proto__)