1、for in循環(huán)在遍歷的時(shí)候,默認(rèn)是可以把自己私有的和所屬類原型(prototype)上擴(kuò)展的屬性和方法都可以遍歷到,但一般情況下,遍歷一個(gè)對(duì)象只需遍歷私有即可,用以下判斷進(jìn)行處理:
for(var key in obj){
if(obj.propertyIsEnumerable(key)){ //枚舉只枚舉私有的
console.log(key);
}或
if(obj.hasOwnProperty(key)){
console.log(key);
}
}
2、Object.create(proObj)方法:創(chuàng)建一個(gè)新對(duì)象,但是要把proObj作為這個(gè)對(duì)象的原型。 在IE6-8不兼容,可自己寫(xiě):
function createObject(){
function fn(){
fn.prototype=o;
return new fn;
}
}
原型繼承(最常用):
子類B想要繼承父類A中的所有屬性和方法(私有+公有),只需要讓B.prototype=new A;即可(B的原型是父類A的一個(gè)實(shí)例)
原型繼承特點(diǎn):它是把父類中的私有+公有的都繼承到了子類原型上(子類公有的)
核心:
原型繼承并不是把父類中的屬性和方法克隆一份一樣的給B,而是讓B和A之間增加了原型鏈的連接,以后B的實(shí)例n想要A中的getX方法,需要一級(jí)級(jí)向上查找來(lái)使用
function A(){
this.x=100;
}
A.prototype.getX=function(){
console.log(this.x);
};
function B(){
this.x=200;
}
B.prototype=new A;

image.png
——————————————————————————————————————
其他繼承:
1、call繼承:
把父類私有的屬性和方法克隆一份一樣的,作為子類私有的屬性
function A(){
this.x=100;
}
A.prototype.getX=function(){
console.log(this.x);
};
function B(){ //this--->n
A.call(this); //--->A.call(n) 把A執(zhí)行,讓A中的this變?yōu)閚
}
var n=new B;
console.log(n.x);
2、冒充對(duì)象繼承:
把父類私有的+公有的 克隆一份一樣的,給子類私有的
function A(){
this.x=100;
}
A.prototype.getX=function(){
console.log(this.x);
};
function B(){ //this--->n
var temp=new A;
for(var key in temp){
this[key]=temp[key];
}
}
var n=new B;
3、混合模式繼承:
原型繼承+call繼承
function A(){
this.x=100;
}
A.prototype.getX=function(){
console.log(this.x);
};
function B(){
A.call(this); //--->n.x=100;
}
B.prototype=new A; //--->B.prototype:x=100;getX...
B.prototype.constructor=B;
var n=new B;
n.getX();
4、寄生組合式繼承:
私有繼承私有,公有的繼承公有
B.prototype=Object.create(A.prototype);
(創(chuàng)建一個(gè)對(duì)象B.prototype,把A的原型作為B的原型),在B的原型上增加了A的原型