构造函数模式(解决了实例的私有属性问题)
function Fn(m,n){
var a = 100;
this.x = m;
this.y = n;
this.getX=function(){
console.log(this.x);
}
}
var f = new Fn(1,2);
var f1 = new Fn(3,4);
console.log(f.getX === f1.getX);//=>false;f中的getX和f1的getX不是同一个空间地址;代表的是不同
的堆内存
原型模式(解决了实例的公有属性问题)
function Fn(m,n){
var a = 100;
this.x = m;
this.y = n;
}
//把getX这个属性统一放到当前实例所属类的prototype这个属性上;getX就是Fn产生实例的一个公有属性;
Fn.prototype.getX=function(){
console.log(this.x);
}
var f = new Fn(1,2);
var f1 = new Fn(3,4);
console.log("getX" in f)//=>true
console.log(f.getX === f1.getX)//=>true=>都调用了Fn.protorype这个属性中getX的空间地址
最重要的三句话
- 所有函数都天生自带一个prototype属性,这个属性名对应的属性值是一个对象;
- 这个对象中又天生自带一个constructor属性,这个属性对应的属性值是当前原型(prototype)所属的类
- 所有的对象都天生自带一个__proto__属性,他的属性值指向当前实例所属类的原型(prototype)
原型链
他是一种基于__proto__向上查找的机制,当我们操作实例的某个属性或是方法的时候,首先会在自己的私有空间找。如果当前属性名不存在,会默认通过__proto__向上一级查找,如果上一级没有,会通过上一级的__proto__向上一级查找,直到找到Object的原型上为止,如果Object的原型上也没有,那么得到undefined;这样通过__proto__向上查找就会形成一个原型链。