JavaScript學習筆記——繼承模式、物件列舉—day six
阿新 • • 發佈:2018-11-21
目錄
3、共享原型(son.prototype=father.prototype)
繼承發展史
1、傳統形式(原型鏈)
過多的繼承了沒用的屬性
2、借用建構函式(call/apply)
不能繼承借用建構函式的原型
每次建構函式都要奪走一個函式
3、共享原型(son.prototype=father.prototype)
不能隨便改動自己的原型,父子都會改變,因為指向的是一個空間。
4、聖盃模式
子物件屬性改變不影響父物件
function Inherit(Target, Origin) { function F() {}; F.prototype = Origin.prototype; Target.prototype = new F(); //史子物件繼承自身的建構函式方法 Target.prototype.constuctor=Target; } Father.prototype.name = 'wang'; function Father() {}; function Son() {}; Inherit(Son, Father); // 注意順序,如果是放到Inherit前面,會再從father繼承一次物件,將屬性覆蓋 Son.prototype.sex = 'male'; var son = new Son(); var father = new Father();
鏈式呼叫實現
(連續呼叫,模仿jquery)return this
var Wang = { eat: function () { console.log("food"); return this; }, smoke: function () { console.log("cigar"); return this; }, sleep: function () { console.log("bed"); return this; } } Wang.eat().smoke().sleep().eat();
屬性表示方法
1、obj.prop
2、obj["prop"] 可用於字串拼接,屬性拼接。
var Miss={
cat1:{color:'black'},
cat2:{color:'white'},
cat3:{color:'yellow'},
sayColor:function(num){
return this['cat'+num];
}
}
物件列舉
(遍歷物件裡面的每一個屬性 enumeration)
for in
var obj={
name:'cat',
age:15,
height:165
}
for(var prop in obj){
console.log(prop+" "+typeof(prop));
}
這裡的prop可以隨便取名。
若寫為:console.log(obj.prop);結果全為Undefined,因為物件後面用點,系統把 prop當成obj的一個屬性了
若要打印出全部屬性和屬性值,改為:console.log(obj[prop]);即可。
但是該方式會把物件原型和祖先的屬性和屬性值打出來,所以我們需要用到hasOwnPrototype方法判斷是否是自身屬性。
1.hasOwnPrototype方法
判斷屬性是否是自己的,是自己的為ture。用於過濾,一般都不希望修改原型。
var obj={
name:'cat',
age:15,
height:165,
//兩個橫線,一共四個橫線
__proto__:{
lastName:'Wang'
}
}
Object.prototype.abc='123';
for(var prop in obj){
// console.log(prop+" "+typeof(prop));
if(obj.hasOwnProperty(prop)){
console.log(obj[prop]);
}
}
但凡自己設的都能顯示,系統給的不能顯示(就是這個__proto__)
2.in操作符
只能判斷物件能不能訪問到這個屬性,父親的也當自己的。
3.instanceof
var A=new B;
A instanceof B;
物件A 是否是 B建構函式構造出來的。(可用於區別陣列和物件)
Object也是ture,
規律:看物件A的原型鏈上有沒有B的原型 。有就為ture.
toString.call
(可用於區別陣列和物件,還有一種區別方法construct)
相當於:
Object.prototype.toString=function(){
// 識別this
// 返回相應的結果
}