js(原型對象與原型鏈)


一,什么是對象

(1).在js中萬物皆對象

(2).對象有自己的屬性,屬性的屬性值可以為任何的內容,當屬性值為函數的時候,我們稱之為方法。當屬性質為對象的時候,稱之為子對象

 var obj = { a : 100, b : function(){}, c : [] d }

(3)數據類型
        原始    number boolean string undefined null

        引用   object array function

        不可以改變的原始類型和可以改變的引用類型(地址的改變)
        數據的存儲,存儲是一個地址,不管是原始類型還是引用類型


        比較運算的時候
        原始類型只會去比較內容
        引用類型比較的時候只會去比較地址,地址相等,內容就相等

 

var abc = 100;    //此次abc定義以后,產生了一個地址
        abc = 200;    //當abc發生改變的時候,從新的更換了地址
        console.log(abc);


        var arr = [];   //只要定義出來了以后,這個引用類型就占據自己的一個空間。引用類型就是引用的一個地址
        arr[0] = 200;
        arr = {}    //這個是強行的改變了地址
        console.log(arr);

 

二.創建的形式

(1).對象字變量

var obj = {};

(2).系統的構造函數

 

var obj = new Object();

 

(3).自己自定義的構造函數

function Person(){
            this.name = "jack";
            this.age = "30";
        }
        var p1 = new Person()

 構造函數,  就是一個函數,只是說這個函數是用來出對象用的。 遵循大駝峰命名規則(人為定義)

// 對象的增刪查改
        var obj = {};
        // 增加:   obj.name = "jack"
        // 刪除:   delete 對象.屬性
        obj.name = "jack";
        delete obj.name;
        console.log(obj)
        // 查看:   對象打點
        // 改       對象打點

三.new關鍵字(當他使用后,內部結構會發生變化)

 

function Person(){
            // var this = {};    //當你使用new關鍵字調用函數以后,里面會產生一個this的空對象
            this.name = "jack";
            this.age = "30";
             return [];     ///最后返回this


            //我強行去改變return的值
        //    return "hallo wold";    //如果要強行改變,必須返回的為引用數據類型,原始數據類型不能返回
        }
        var p1 = new Person()
        console.log(typeof p1)

 

四.原始數據類型的字符串

var str = "hello world";
        //字符串對象
        var str1 = new String("hello world");   //new + 構造函數    str1肯定是一個對象

        console.log(typeof str)
        console.log(typeof str1)
        // 原始類型是不能添加屬性和方法的
        str.abc = "nihao "    //可以添加上去,但是馬上刪除,因為他是原始類型
        console.log(str.abc);

        str1.abc = "nihao";
        console.log(str1.abc);


        // 包裝類
        var num = 10;
        var num1 = new Number(10);
        console.log(num,num1)

        var bol = true;
        var bol1 = new Boolean(true);
        console.log(bol,bol1)
        console.log(typeof num1)

 

五.原型對象與原型鏈

(1)原型就是一個屬性,這個屬性是構造函數的屬性,構造函數是用來制造用來出對象的,是構造函數制造出來的公共祖先,后面所有的對象都會繼承原型的屬性與方法(原型也是個對象)

(2)__proto__這個是用來查看原型的,這個是對象的屬性,這個屬性可以查看但是不能修改(隱式屬性)

(3)prototype 設置原型,這個是構造函數的屬性

 

    Person.prototype.play = "會玩"    //公共祖先
        function Person(name,age){
            // var this = {
                // __proto__ : Person.prototype
            // }
            this.name = name;
            this.age = age;

            // return this;
        }

        var p1 = new Person("jack",20);
        var p2 = new Person("mack",30);
        console.log(p1);
        console.log(p2);


        console.log(p1.__proto__)
        console.log(p1.constructor)    //這個是對象的屬性,主要是看該對象的爹是誰
      
        var obj = {

        }

        console.log(obj.constructor)
        var str1 = "123"
        //String.prototype.abcd = "456"
        str1.abcd

        //利用原型的特點,可以提取對象的公共屬性,解決代碼的耦合

問題1:以下程序中輸出的結果為:

        Array.prototype.say = function(){
            console.log('數組會說話了')
            return 
        }

        var arr = [];   //數組字面量
        var arr1 = new Array()   //new 數組的構造
         arr.say()
         console.log(arr.say())
結果:數組會說話了 ;undefined
原因:如果沒有返回值語句或表達式,則會返回undefined;
如果沒有合法的表達式語句或表達式,則會拋出語法錯位的異常


(5).原型鏈

 

 

舉例:

    Grand.prototype.zhangxiang = "帥";
        function Grand(){
            this.play = "會打球"
        }
        var grand = new Grand();
        Father.prototype = grand;
        function Father (){
            this.name = "小明"
        }
        var father = new Father();
        Son.prototype = father;
        function Son(){
            this.hobbit = "smoke"
        }
        var son = new Son()

面試題:


        // javascript中,有幾種數據類型?
        // 怎么去判斷這些數據類型?typeof
        // typeof可以返回幾種值?
            // 六種
            // number string boolean undefined object function

            // typeof null
            // typeof array
            // typeof object
        // 怎么去區分這三個object?
        // Object.prototype.toString.call()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM