原型是javascript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性。
一、初识原型
在javascript中,原型也是一个对象,通过原型可以实现对象的属性继承,javascript的对象中都包含了一个”[[prototype]]”内部属性,这个属性所对应的就是该对象的原型。
“[[prototype]]”作为对象的内部属性,是不能被直接访问的。所以为了方便查看一个对象的原型,firefox和chrome中提供了__proto__这个非标准(不是所有浏览器都支持)的访问器(ecma引入了标准对象原型访问器”object.getprototype(object)”)。在javascript的原型对象中,还包含一个”constructor”属性,这个属性对应创建所有指向该原型的实例的构造函数
二、规则
在javascript中,每个函数 都有一个prototype属性,当一个函数被用作构造函数来创建实例时,这个函数的prototype属性值会被作为原型赋值给所有对象实例(也就是设置 实例的`__proto__`属性),也就是说,所有实例的原型引用的是函数的prototype属性。(****`只有函数对象才会有这个属性!`****)
new 的过程分为三步
?
var p = new person('张三',20);
1. var p={}; 初始化一个对象p。
2. p._proto_=person.prototype;,将对象p的 __proto__ 属性设置为 person.prototype
3. person.call(p,”张三”,20);调用构造函数person来初始化p。关于call/apply使用
举个例子:
有如下场景
man extends person extends object
var a = new man();
a的原型就是man.prototype
man.prototype也是一个对象,那么它也有一个指针指向它自己的原型,那就是person.prototype
同理,person.prototype的原型就是object.prototype
object.prototype也是对象,同理,只不过它的原型为null,那么也就到了原型链的末端
a的原型链路如下图
记住一点:对象的原型就是它的构造函数的原型,照样拿上图的a对象来举例的话,也就是:a.__proto__ === man.prototype
以上就是javascript中一个比较难理解的概念--原型的详细内容。