對象和對象原型

JavaScript 中的萬物皆對象:字符串、數值、數組、函數...

對象只是帶有屬性和方法的特殊數據類型:

Oobject類型的創建方法
??????1.使用new運算符

      var obj =  new Object(); // 或者省略new  var obj = Object();
      obj.name = "張三";
      obj.age = 18;

??????2.使用字面量方式創建,鍵值對方式:k: v

      var obj0 = {
          name: "張三",  
          age: 18
      }; 
      // 或者屬性字段用字符串形式:
      obj1 = {
          "name": "張三", 
          "age": 18
      };
      // 也可以用傳統的賦值方式:
      var obj2 = {};
      obj2.name = " 張三";
      obj2.age = 18;

??????3.給對象創建方法

    var obj = {
        run: function() {
            return '正在奔跑';
        }
    }

構造函數

構造函數:通常使用構造函數代表類

    function Animal(name, age) {
        this.name = name; // this指的是使用new關鍵字,調用Animal所創建的對象
        this.age = age;
        this.show = function() {
            console.log(this.name + ',' + this.age);
        };
    };
    var animal1 = new Animal('熊貓', 2);
    var animal2 = new Animal('東北虎', 3);
    animal1.show(); // 熊貓, 2
    animal2.show(); // 東北虎, 3
image.png

其實在js中并沒有類的概念,但是通常我們認為構造函數就是類。
上面的Animal就是類,animal1和animal2是對象,也是Animal的實例
類是對象的抽象
對象是類的具體

注意

  • 在Animal使用new關鍵字創建的過程中,內部會自動創建一個對象;
  • 然后把this這個指針指向創建的這個對象;
  • 執行完代碼后,還會返回這個對象;

原型對象

prototype:原型

    function Box() { // 構造函數
    };
    Box.prototype.name = "虞姬";
    Box.prototype.age = "18";
    Box.prototype.show = function() {
        console.log(this.name + ',' + this.age);
    };
    var box = new Box(); // 實例
    console.log(box.name); // 虞姬
    console.log(box.age); // 18
    console.log(box.show); // 虞姬, 18
  • constructor: 原型對象prototype的屬性,指向當前原型所屬的構造函數,即:
    console.log(Box.prototype.constructor === Box); // true
image.png
  • _ _ proto _ _屬性:實例對象指向原型對象的一個指針,它的作用是指向構造函數的原型,即
    console.log(box.__proto__ === Box.prototype); // true
    console.log(box.__proto__.name); // 虞姬
image.png
  • isPrototype(): 用來判斷某個對象是否指向該原型對象的構造函數
    ?1.查找實例對象是否存在該屬性,如果存在則返回該屬性的值;
    ?2.如果不存在,則查找原型對象中是否存在,若存在,則返回該屬性的值;
    ?3.如果都不存在,則返回underfine。
    console.log(Box.prototype.isPrototype(box)); // true
    console.log(Box.prototype.isPrototype(box1)); // underfine
  • hasOwnPrototype(): 用來判斷該實例對象中是否含有該屬性
    ?1.存在,則返回true;
    ?2.不存在,則返回false;
    console.log(box.hasOwnPrototype(name)); // true
    console.log(box.hasOwnPrototype(type)); // false
  • in操作符:用于判斷屬性是否存在實例對象或者原型對象
    ?首先會先判斷當前實例對象中是否存在該屬性,若存在,則返回true;若不存在,則會繼續在原型對象中查找該屬性,若存在,則返回true;若不存在,則繼續往原型鏈的頂端Object.prototype中找,如果都沒有就會返回false。
    console.log("name" in box); // true
    console.log("type" in box); // false
  • 原型鏈

    ?所有的函數對象都繼承自原始函數對象;Function比較特殊,他的原型對象也就是原始函數對象;所以我們往往用Function.prototype表示原始函數對象;而原始函數對象又繼承自原始對象。
    image.png
  • 封裝:把部分屬性和方法封裝起來,不提供給外界使用
    // 工廠模式創建
    function createObject(_name, _age) {
        var obj = new Object(); // 創建對象
        obj.name = _name;
        obj.age = _age;
        obj.show = function() {
            console.log(this.name + ',' + this.age);
        };
        return obj;
    }
    var person1 = createObject('Jacky', 18);
    var person2 = createObject('喵喵', 20);
    person1.show(); // Jacky, 18
    person2.show(); // 喵喵,20
  • 繼承:可以把原有對象(父類)的屬性和方法,復制給一個新的對象,新的對象還可以擁有自己的屬性和方法
    ?1.原型鏈繼承
    ?2.對象冒充,call和apply繼承
    ???????對象.call(新this對象,實參1,實參2,實參3.....)
    ???????對象.apply(新this對象,[實參1,實參2,實參3.....])
    function Cat() { // 父類
        this.fur = "有軟毛";
        this.eat = function() {
            console.log("喜歡吃魚");
        };
        this.call = function() {
            console.log("喵~");
        }
    };
    function GarfriendCat() {
        this.galssess = "戴墨鏡"; // 新增自己的屬性
        this.talk = function() { // 新增自己的方法
            console,log("會說話");
        };
        this.eat = function() { // 重寫父類的eat方法
            console.log("只吃肉!");
        }
    };
    GarfriendCat.prototype = new Cat(); // 使用原型鏈來實現繼承。
    // 對象冒充: 借用構造函數Cat,用this冒充Cat
    function Person(_name, _age) {
        this.name = _name;
        this.age = _age;
    }
    // call
    function CallCopy(_name, _age, _gender) { 
        Person.call(this, _name, _age);
        this.gender = _gender;
    } ;
    var callCopy = new CallCopy('Jacky', 18, '男');
    console.log(callCopy.name, callCopy.age, callCopy.gender); // Jacky 18 男
    // apply
    function ApplyCopy(_name, _age, _gender) { 
        Person.apply(this, [_name, _age]);
        this.gender = _gender;
    } ;
    var applyCopy = new ApplyCopy('Lusi', 20, '女');
    console.log(applyCopy.name, applyCopy.age, applyCopy.gender); // Lusi 20 女
  • 多態:基于繼承,父類可以指向不同的子類,父類調用同一個方法時,不同的子類執行的效果不一樣。
    function beGoodAt(animal) {
        animal.show();
    };
    var Monkey = function() {};
    Monkey.prototype.show = function() {
        console.log('猴子擅長于爬樹');
    }
    var Cheetah = function() {}
    Cheetah.prototype.show = function() {
        console.log('獵豹擅長于奔跑');
    }
    beGoodAt(new Monkey()); // 猴子擅長于爬樹
    beGoodAt(new Cheetah()); // 獵豹擅長于奔跑
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375