原型链模式(拓展)
this和原型
在原型模式中,this常用的两种情况:
在类中this.xxx=xxx;this>>当前类的实例
某一个方法中的this>>看执行的时候“.”前面是谁,this就是谁
1)需要先确定this的指向(this是谁)
2)把this替换成对应的
案例五
function Fn(){
this.x=100;
this.y=200;
this.getY:function(){
console.log(this.y);
};
}
Fn.prototype={
constructor:Fn,
y=300,
getX:function(){
console.log(this.x);
},
getY:function(){
console.log(this.y);
}
};
var f=new Fn;
f.getX();
>>100>>console.log(f.x)
f.__proto__.getX();
>>this是__proto__>>console.log(__proto__)>>undefined
f.getY();
>>200
Fn.prototype.getX();
>>undefined
f.__proto__.getY();
>>300
Array.prototype.myUnique=function(){
>>this
};
var ary[];
ary.myUnique();
>>this是ary
Array.prototype.myUnique();>>this是Array.prototype
在内置类的原型上拓展方法
案例六
Array.prototype.myUnique=function(){
// >>this>>ary
var obj={};
for(var i=0;i<this.length;i++){
var cur=this[i];
if(obj[cur]==cur){
this[i]=this[this.length-1];
this.length--;
i--;
continue;
}
obj[cur]=cur;
}
obj=null;
};
var ary[10,12,13,11,16,18,31,21,10];
普通:
ary.sort(function(a,b){
return a-b;
});
ary.reverse();
ary.pop();
链式:
执行完数组的一个方法可以紧接着执行下一个方法
原理:
ary为什么可以使用sort方法?
因为sort是Array.prototype上的公有的方法,而且数组ary是Array这个类的一个实例,所以ary可以使用sort方法
数组才能使用Array原型上定义的属性和方法
sort执行完成的返回值是一个排序后的“数组”,可以继续执行
reverse执行完成的返回值是一个数组,可以继续执行
pop执行完成的返回值是被删除的那个元素,不是一个数组,所以再执行push报错
链式:
ary.sort(function(a,b){
return a-b;
}).reverse().pop();
ary.myUnique();
案例七
Array.prototype.myUnique=function(){
// >>this>>ary
var obj={};
for(var i=0;i<this.length;i++){
var cur=this[i];
if(obj[cur]==cur){
this[i]=this[this.length-1];
this.length--;
i--;
continue;
}
obj[cur]=cur;
}
obj=null;
return this;>>为了实现链式写法
};
var ary[10,12,13,11,16,18,31,21,10];
ary.myUnique();.sort(function(a,b){
return a-b;
});
console.log(ary);