var a = {} 其实是 var a = new Object() 的语法糖
var a = [] 其实是 var a = new Array() 的语法糖
function Foo(){...}其实是 var Foo = new Function(){...}的语法糖
5条原型规则
1. 所有的引用类型(对象、数组、函数)都有对象特性,可自由扩展属性(null除外)
2.所有的引用类型(对象、数组、函数)都有一个__proto__属性,属性值是一个普通的对象
3.所有的函数都有一个prototype属性,属性值是一个普通的对象
4.所有的引用类型(对象、数组、函数),__proto__属性值指向它的构造函数的prototype属性值
5。当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的__proto__(即它构造函数的prototype中寻找)
每个函数 都有一个prototype属性,当一个函数被用作构造函数来创建实例时,这个函数的prototype属性值会被作为原型赋值给所有对象实例
new 创建对象的过程?
1.创建一个新对象
2. this指向这个新对象
3. 执行代码,即对this赋值
4. 返回this
function aa(){
a.prototype.name="Micheal";
a.prototype.showNmae=function(){
console.log(this.name);
}
}
function AA(){
A.prototype.age=15;
A.prototype.showAge=function(){
console.log(this.age);
}
}
//AA继承aa
AA.prototype = new aa();
var BB = new AA();
console.log(BB);
console.log(BB.showName()); //Micheal
大致流程就是通过AA.prototype=new aa();使得AA.prototype(原型对象)下的__prototype__指向aa.prototype,当创建引用类型AA的实例化对象BB时,BB内部会产生一个__proto__属性指向AA的对象原型,再通过AA原型对象中的__proto__指向aa的原型对象,从而实现实例对象BB对aa的继承,整个链向:BB的__proto__-->AA.prototype-->aa.prototype,这就是一条原型链,如果再继续延伸的话,aa的原型对象下的__proto__属性会指向Function本身。
本人正在不断地学习和摸索中,如有错误,欢迎指正!