原型对象
每个对象都有一个原型 prototype 对象,通过函数创建的对象也将拥有这个原型对象。原型是一个指向对象的指针。
- 可以将原型理解为对象的父亲(类似java的继承),对象从原型对象继承来属性
- 所有函数的原型默认是 Object的实例,所以可以使用toString/toValues/isPrototypeOf 等方法的原因
- 使用原型对象为多个对象共享属性或方法
- 如果对象本身不存在属性或方法将到原型上查找
- 使用原型可以解决,通过构建函数创建对象时复制多个函数造成的内存占用问题
- 原型包含 constructor 属性,指向构造函数
- 对象包含 proto 指向他的原型对象
prototype
无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,默认情况下prototype属性会默认获得一个constructor(构造函数)属性
function lst(){
this.name = "lst";
this.fn = function(){}
}
var lst01 =new lst();
console.log(lst01);
当实例创建时会自动获得prototype属性,prototype是一个对象,也生成一个构造器,属性指向Object顶层对象
对象具有属性__proto__,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。
通过prototype 可以为对象添加方法或属性,因为原型链的顺序是,从第一个对象一层层向上寻找,当子类有这个属性便不再往上寻找,子类的相同方法会覆盖父类的同名方法。
例:bootstrapTable.prototype.add =… ,为bootstrapTable这个对象添加了add方法,覆盖了原方法,
下面这个例子可以形象的显示原型链
__proto__与prototype的区别
个人认为 proto 函数使用 ,prototype实例后使用
ES6新增的class本质其实是原型的语法糖
//es5
Person.prototype.getInfo=function(){
}
//es6
class Person{
getInfo(){},
toString(){}
}
//等同于
Person.prototype={
getInfo(){},
toString(){}
}
//还可以通过Object.assign()方法
Object.assign(Person.prototype,{
getInfo(){},
toString(){}
});