1. 程式人生 > >JavaScript學習筆記——繼承模式、物件列舉—day six

JavaScript學習筆記——繼承模式、物件列舉—day six

目錄

繼承發展

1、傳統形式(原型鏈)

2、借用建構函式(call/apply)

3、共享原型(son.prototype=father.prototype)

4、聖盃模式

鏈式呼叫實現

屬性表示方法

物件列舉

for in

1.hasOwnPrototype方法

2.in操作符

3.instanceof

toString.call


繼承發展史

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

// 返回相應的結果

}