創(chuàng)建對象---筆記【js高級程序設(shè)計】

幾個關(guān)于類的前提概念:

  • 類/繼承描述了一種代碼的組織結(jié)構(gòu)形式梧宫,類意味著復(fù)制
  • 類的核心概念:類、繼承肋层、實例化和多態(tài)【多態(tài)可以簡述為父類的通用行為被子類用更特殊的行為重寫】;
  • javascript不存在類翎迁,但基于類是一種設(shè)計模式這一前提栋猖,js通過一些方法近似實現(xiàn)了類的功能;

1.工廠模式

// 工廠模式
    function person(name, age, title) {
      var o = {}
      o.name = name;
      o.age = age;
      o.title = title;
      o.saySomething = function() {
        console.log(this.name);
      }
      return o
    }
    
    var person1 = person('孫悟空', 18, '齊天大圣')
    var person2 = person('豬八戒', 26, '天蓬元帥')

    console.log(person1);
    console.log(person2);
打印結(jié)果
{name: "孫悟空", age: 18, title: "齊天大圣", saySomething: ?}
age: 18
name: "孫悟空"
saySomething: ? ()
title: "齊天大圣"
__proto__:
constructor: ? Object() 
hasOwnProperty: ? hasOwnProperty()
isPrototypeOf: ? isPrototypeOf()
propertyIsEnumerable: ? propertyIsEnumerable()
toLocaleString: ? toLocaleString()
toString: ? toString()
valueOf: ? valueOf()
__defineGetter__: ? __defineGetter__()
__defineSetter__: ? __defineSetter__()
__lookupGetter__: ? __lookupGetter__()
__lookupSetter__: ? __lookupSetter__()
get __proto__: ? __proto__()
set __proto__: ? __proto__()
問題
  • 創(chuàng)建的對象之間沒有任何聯(lián)系汪榔,缺乏可識別的類似類的特性蒲拉;

2.構(gòu)造函數(shù)

// 構(gòu)造函數(shù)模式
    function Person(name, age, title) {
      this.name = name;
      this.age = age;
      this.title = title;
      this.saySomething = function() {
        console.log(this.name);
      }
    }
    
    var person1 =new Person('孫悟空', 18, '齊天大圣')
    var person2 =new Person('豬八戒', 26, '天蓬元帥')

    console.log(person1);
    console.log(person2);

打印結(jié)果

Person {name: "孫悟空", age: 18, title: "齊天大圣", saySomething: ?}
age: 18
name: "孫悟空"
saySomething: ? ()
title: "齊天大圣"
__proto__:
   constructor: ? Person(name, age, title)
   __proto__:
      constructor: ? Object()
      hasOwnProperty: ? hasOwnProperty()
      isPrototypeOf: ? isPrototypeOf()
      propertyIsEnumerable: ? propertyIsEnumerable()
      toLocaleString: ? toLocaleString()
      toString: ? toString()
      valueOf: ? valueOf()
      __defineGetter__: ? __defineGetter__()
      __defineSetter__: ? __defineSetter__()
      __lookupGetter__: ? __lookupGetter__()
      __lookupSetter__: ? __lookupSetter__()
      get __proto__: ? __proto__()
      set __proto__: ? __proto__()

特征

  • 沒有顯式的創(chuàng)建對象
  • 屬性和方法直接賦值給this對象
  • 沒有return語句
  • __ proto __屬性中保存著constructor【構(gòu)造函數(shù)】屬性,該屬性指向Person

問題:

  • 方法的重新創(chuàng)建會造成內(nèi)存的浪費
  • 將方法定義在全局,然后將引用賦值給this.saySomething雌团,可以解決重復(fù)創(chuàng)建多個相同函數(shù)的問題燃领,但又會引入方法缺乏封裝性的問題

3.原型模式

函數(shù)的prototype屬性:

打印構(gòu)造函數(shù)Person的結(jié)果

向構(gòu)造函數(shù)的原型上添加屬性和方法:

function Person() { 
    }
    // 向構(gòu)造函數(shù)的原型上添加屬性和方法
      Person.prototype.name = '孫悟空';
      Person.prototype.age = 18;
      Person.prototype.title = '齊天大圣';
      Person.prototype.saySomething = function() {
        console.log(this.name);
      }

    var person1 =new Person()
    var person2 =new Person()

    console.log(person1);
    console.log(person2);
    console.dir(Person);

實例對象和構(gòu)造函數(shù)的打印結(jié)果

__ proto __和prototype的解析:

Snipaste_2020-09-12_15-53-29.png

4.原型模式語法的精簡

function Person() {}
    // 向構(gòu)造函數(shù)的原型上添加屬性和方法
    Person.prototype = {
      name: '孫悟空',
      age: 18,
      title: '齊天大圣',
      saySomething: function () {
        console.log(this.name);
      }
    }
    
    var person1 = new Person()
    var person2 = new Person()

    console.log(person1);
    console.log(person2);
    console.dir(Person);
打印結(jié)果

這里對prototype賦值對象,完全重寫了prototype,通過以下代碼保證constructor的指向锦援;

 Person.prototype = {
      // 保證contructor的指向
      constructor: Person,
      name: '孫悟空',
      age: 18,
      title: '齊天大圣',
      saySomething: function () {
        console.log(this.name);
      }
    }

注意: 此時的constructor的可遍歷性為真猛蔽,原生的是不可遍歷的,可通過Object.defineProperty()進行數(shù)據(jù)屬性的設(shè)置灵寺;

感覺挺重要的3點:

  • 實例與原型之間的連接只不過是一個指針曼库,而非是一個副本;
  • 原型具有動態(tài)性略板,即可以先創(chuàng)建實例毁枯,之后再在原型上添加新屬性或方法,實例依然能夠讀取原型上的屬性或方法叮称;
  • 重寫原型會喪失這種動態(tài)性

原型對象的問題:

function Person() {}
    // 向構(gòu)造函數(shù)的原型上添加屬性和方法
    Person.prototype = {
      // 保證contructor的指向
      constructor: Person,
      name: '孫悟空',
      age: 18,
      title: '齊天大圣',
      friends: ['八戒', '沙僧'],
      saySomething: function () {
        console.log(this.name);
      }
    }
    

    var person1 = new Person()
    var person2 = new Person()
//修改其中一個實例person1中的引用類型的屬性值
    person1.friends.push('哪吒')
    console.log(person1);
    console.log(person2);
    console.dir(Person);
打印結(jié)果

注:基本屬性的值會產(chǎn)生屏蔽种玛,即在實例上修改同名屬性,會在實例上創(chuàng)建屬性瓤檐,并且通過實例訪問時蒂誉,會遮蔽原型上的同名屬性;

5.構(gòu)造函數(shù)和原型的結(jié)合

簡述就是用構(gòu)造函數(shù)來定義實例屬性【保證實例屬性的獨立性】距帅,原型模式用于定義方法和共享屬性

  function Person(name, age, title) {
      this.name = name;
      this.age = age;
      this.title = title;
      // 這樣實例的引用類型的屬性就是獨立的了
      this.friends = ['八戒', '沙僧']
      this.saySomething = function () {
        console.log(this.name);
      }
    }

    Person.prototype = {
      constructor: Person,
      saySomething: function () {
        console.log(this.name);
      }
    }

    var person1 = new Person('孫悟空', 18, '齊天大圣')
    var person2 = new Person('豬八戒', 26, '天蓬元帥')

    console.log(person1);
    console.log(person2);
    console.dir(Person);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末右锨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碌秸,更是在濱河造成了極大的恐慌绍移,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讥电,死亡現(xiàn)場離奇詭異蹂窖,居然都是意外死亡,警方通過查閱死者的電腦和手機恩敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門瞬测,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纠炮,你說我怎么就攤上這事月趟。” “怎么了恢口?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵孝宗,是天一觀的道長。 經(jīng)常有香客問我耕肩,道長因妇,這世上最難降的妖魔是什么问潭? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮婚被,結(jié)果婚禮上狡忙,老公的妹妹穿的比我還像新娘。我一直安慰自己址芯,他們只是感情好去枷,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著是复,像睡著了一般删顶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淑廊,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天逗余,我揣著相機與錄音,去河邊找鬼季惩。 笑死录粱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的画拾。 我是一名探鬼主播啥繁,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼青抛!你這毒婦竟也來了旗闽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蜜另,失蹤者是張志新(化名)和其女友劉穎适室,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體举瑰,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡捣辆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了此迅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汽畴。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耸序,靈堂內(nèi)的尸體忽然破棺而出忍些,到底是詐尸還是另有隱情,我是刑警寧澤佑吝,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布坐昙,位于F島的核電站绳匀,受9級特大地震影響芋忿,放射性物質(zhì)發(fā)生泄漏炸客。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一戈钢、第九天 我趴在偏房一處隱蔽的房頂上張望痹仙。 院中可真熱鬧,春花似錦殉了、人聲如沸开仰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽众弓。三九已至,卻和暖如春隔箍,著一層夾襖步出監(jiān)牢的瞬間谓娃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工蜒滩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滨达,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓俯艰,卻偏偏與公主長得像捡遍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子竹握,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348