1、任何函数,即function,都有一个prototype属性,即原型属性。
2、任何prototype属性中都有一个construtor属性,指向function
function Test(){}
console.log(Test.prototype.constructor==Test) //true
3、当通过new 来创建function时,即创建了function的一个实例对象,简称实例(创建实例对象的方法有多种,为了避免叙述复杂,这篇文章暂时不涉及)
4、new意思是新开辟了一个内存空间(堆)来存放function的内容,实例对象指向这个内存空间的地址
5、在每个实例中定义的属性只属于实例自身,不共享。
6、function中的普通属性,通过this指针来传递作用域。即,当需要new一个实例时,函数中的属性应该用this.name=xxx这种形式定义,则this作用域代表当前实例,新实例才能调用到这个属性。不用this定义的变量默认都属于windows对象(浏览器端)
function Aaa()
{ this.name='sdf' //name属于当前作用域的属性
name1='aaaa' //name1属于windows对象的属性
}
var a1=new Aaa();
console.log(a1.name) //正确,此时this指向a1
console.log(a1.name1)//undefined,name1是windows的对象
7、实例中会包含一个__proto__属性,指向function的prototype属性,因此就形成了一个链式调用
"实例对象.__proto__ 指向 function.prototype ,
function.prototype中的consturtor指向function"
function Test(){}
Test.prototype={};
var tt=new Test();
console.log(tt.__proto__==Test.prototype); //true
8、定义在构造函数中的对象属性或方法(通过this指针)属于实例对象,不共享,创建在prototye属性中的对象属性或方法,相当于静态方法,所有函数、实例对象共享。
function Bbb(name)
{ this.name=name ;//name属于当前作用域的属性 }
var b2=new Bbb("Vicky");
var b3=new Bbb("Marry");
console.log(b2.name===b3.name) //false
Bbb.prototype.getName=function(){return "hello bbb"}; //给函数Bbb的原型属性prototype添加一个getName函数方法
console.log(b2.getName()); //"hello bbb" //实例对象调用原型方法时直接调用
console.log(b2.getName()===Bbb.prototype.getName());//true
console.log(b3.getName()===Bbb.prototype.getName());//true
console.log(b2.getName()===b3.getName()); //true
9、如果构造函数和原型属性都定义同样的方法,则构造函数覆盖原型属性中的方法
function Ccc(){ }
Ccc.prototype.name="Vicky";
var c4=new Ccc();
c4.name="Tom";
var c5=new Ccc();
console.log(c4.name); //Tom
console.log(c5.name);//Vicky