对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性。
一、初始原型
在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个”[[Prototype]]”内部属性,这个属性所对应的就是该对象的原型。
“[[Prototype]]”作为对象的内部属性,是不能被直接访问的。所以为了方便查看一个对象的原型,Firefox和Chrome中提供了proto这个非标准(不是所有浏览器都支持)的访问器(ECMA引入了标准对象原型访问器”Object.getPrototype(object)”)。
在JavaScript的原型对象中,还包含一个”constructor”属性,这个属性对应创建所有指向该原型的实例的构造函数
二、规则
在JavaScript中,每个函数 都有一个prototype属性,当一个函数被用作构造函数来创建实例时,这个函数的prototype属性值会被作为原型赋值给所有对象实例(也就是设置 实例的__proto__
属性),也就是说,所有实例的原型引用的是函数的prototype属性。(
只有函数对象才会有这个属性!
)
new 的过程
var obj = new Person("孙悟空");
- var obj = {}; 初始化一个对象 p
- obj.proto=Person.prototype; 将对象 obj 的proto属性设置为 Person.prototype
- Person.call(obj,”孙悟空”); 调用构造函数Person来初始化p。关于call/apply使用
- 执行构造函数中的代码
- 如果函数没有返回值,那么就会自动返回这个新对象