javascript創(chuàng)建對象的方法诽凌。es6 class 創(chuàng)建對象用es5實現(xiàn)

(學習筆記)javascript創(chuàng)建對象的幾種方式,以及es6 class 如何轉化成es5代碼創(chuàng)建對象

原文地址

1. 最簡單的對象字面量和Object構造函數(shù)兩種方式####

//object構造函數(shù)方法
var person = new Object();
person.age = 22;
person.name = 'Dolanf';
person.code = function() {
  console.log(‘hello world艰山!’);
};

//字面量方法
var person = {
    age: 22,
    name: 'Dolanf',
    code: function() {
         console.log('hello world!');
    }
}

但是這兩種方法只能創(chuàng)建一個對象涣仿,無法進行批量創(chuàng)建,不利于封裝嗜桌。

2. 工廠模式####

function createPerson(age, name) { 
    var o = new Object();
    o.age = age;
    o.name = name;
    o.code = function() {
         console.log('hello world!');
    };
 
    return o;
}
 
var person1 = createPerson(11, '小白');
var person2 = createPerson(12, '小黑');

但是這種方法也有一個問題奥溺,那就是我們無法辨別對象。在每一個對象的proto屬性中骨宠,construction屬性都是Object浮定。

3. 構造函數(shù)模式和原型模式####

//構造函數(shù)模式
function Person(age, name) { 
    this.age = age;
    this.name = name;
    this.code = function() {
         console.log('hello world!');
    };
}

var person1 = new Person(11, '小白');
var person2 = new Person(12, '小黑');

//原型模式

function Person(age, name) { 
    Person.prototype.age = age;
    Person.prototype.name = name;
    Person.prototype.code = function() {
         console.log('hello world!');
    };
}

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


//構造函數(shù)+原型組合模式

function  Person(age, name) { 
    this.age = age;
    this.name = name;
    this.cry = function() {
         console.log(name + 'is crying!!! T^T');
    }
}
Person.prototype = {
    constructor: Person,
    sayName: function() {
        console.log(this.name);
    }
}
var person1 = new Person(11, '小白');
var person2 = new Person(12, '小黑');

這兩個模式层亿,分別都走了極端桦卒。構造函數(shù)模式在創(chuàng)建對象時,每一個屬性都會被重新創(chuàng)建匿又。而在原型模式每一個屬性只會被創(chuàng)建一次方灾,而且改變其中一個對象的屬性,會污染其他對象琳省。而這兩者的結合就解決了兩方的缺點迎吵。

4. es6 class創(chuàng)建對象####


function  Person(age, name) { 
    this.age = age;
    this.name = name;
    this.cry = function() {
         console.log(name + 'is crying!!! T^T');
    }
}
Person.prototype = {
    constructor: Person,
    sayName: function() {
        console.log(this.name);
    }
}
var person1 = new Person(11, '小白');
var person2 = new Person(12, '小黑');


class Person{ 
    constructor(age, name) {
        this.age = age;
        this.name = name;
        this.cry = function() {
         console.log(name + 'is crying!!! T^T');
        }
    }
    sayName() {
        console.log(this.name);
    }
}
var person1 = new Person(11, '小白');
var person2 = new Person(12, '小黑');

es5和es6 class定義對象的區(qū)別

  • class的構造函數(shù)必須使用new進行調用,普通構造函數(shù)不用new也可執(zhí)行针贬。
  • class不存在變量提升击费,es5中的function存在變量提升。
  • class內部定義的方法不可枚舉桦他,es5在prototype上定義的方法可以枚舉

'use strict'; // es6中class使用的是嚴格模式

// 處理class中的方法
var _createClass = function () { 
   function defineProperties(target, props) { 
      for (var i = 0; i < props.length; i++) { 
         var descriptor = props[i]; 
         // 默認不可枚舉
         descriptor.enumerable = descriptor.enumerable || false; 
         descriptor.configurable = true; 
         if ("value" in descriptor) descriptor.writable = true; 
         Object.defineProperty(target, descriptor.key, descriptor);
      } 
   } 
   return function (Constructor, protoProps, staticProps) { 
      if (protoProps) defineProperties(Constructor.prototype, protoProps); 
      if (staticProps) defineProperties(Constructor, staticProps); 
      return Constructor; 
   }; 
}();

// 對構造函數(shù)進行判定
function _classCallCheck(instance, Constructor) { 
   if (!(instance instanceof Constructor)) { 
      throw new TypeError("Cannot call a class as a function"); 
   }
}

// class Person轉換為 es5的function
var Person = function () {
    function Person(age, name) {
        // 調用了_classCallCheck檢查Person是否為構造函數(shù)
        _classCallCheck(this, Person); 

        this.age = age;
        this.name = name;
        this.cry = function () {
            console.log(name + 'is crying!!! T^T');
        };
    }

    // 調用_createClass處理定義在class中的方法蔫巩。
    _createClass(Person, [{
        key: 'sayName',
        value: function sayName() {
            console.log(this.name);
        }
    }]);

    return Person;
}();

var person1 = new Person(11, '小白');
var person2 = new Person(12, '小黑');


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末谆棱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子圆仔,更是在濱河造成了極大的恐慌垃瞧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坪郭,死亡現(xiàn)場離奇詭異个从,居然都是意外死亡,警方通過查閱死者的電腦和手機歪沃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門嗦锐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沪曙,你說我怎么就攤上這事奕污。” “怎么了液走?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵碳默,是天一觀的道長。 經(jīng)常有香客問我缘眶,道長嘱根,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任磅崭,我火速辦了婚禮儿子,結果婚禮上瓦哎,老公的妹妹穿的比我還像新娘砸喻。我一直安慰自己,他們只是感情好蒋譬,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布割岛。 她就那樣靜靜地躺著,像睡著了一般犯助。 火紅的嫁衣襯著肌膚如雪癣漆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天剂买,我揣著相機與錄音惠爽,去河邊找鬼。 笑死瞬哼,一個胖子當著我的面吹牛婚肆,可吹牛的內容都是我干的。 我是一名探鬼主播坐慰,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼较性,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起赞咙,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤责循,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后攀操,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體院仿,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年速和,在試婚紗的時候發(fā)現(xiàn)自己被綠了意蛀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡健芭,死狀恐怖县钥,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情慈迈,我是刑警寧澤若贮,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站痒留,受9級特大地震影響谴麦,放射性物質發(fā)生泄漏。R本人自食惡果不足惜伸头,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一匾效、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恤磷,春花似錦面哼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至河胎,卻和暖如春闯袒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背游岳。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工政敢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胚迫。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓喷户,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晌区。 傳聞我的和親對象是個殘疾皇子摩骨,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • class的基本用法 概述 JavaScript語言的傳統(tǒng)方法是通過構造函數(shù)通贞,定義并生成新對象。下面是一個例子: ...
    呼呼哥閱讀 4,091評論 3 11
  • 一恼五、ES6簡介 ? 歷時將近6年的時間來制定的新 ECMAScript 標準 ECMAScript 6(亦稱 ...
    一歲一枯榮_閱讀 6,071評論 8 25
  • 三昌罩,字符串擴展 3.1 Unicode表示法 ES6 做出了改進,只要將碼點放入大括號灾馒,就能正確解讀該字符茎用。有了這...
    eastbaby閱讀 1,532評論 0 8
  • 這個真的是超實用啊.除了一些已經(jīng)不再維護的..超好用都,開發(fā)必備 圖像: 1.圖片瀏覽控件MWPhotoBrow...
    飛奔的羊閱讀 1,811評論 0 3
  • 最幾天沒有寫簡書,主要在想自己的一些奇葩事情睬罗,都是一些讓人哭笑不得的事情轨功,比如手機密碼忘了、燃氣卡失效了容达、...
    FineYoga蕓蕓閱讀 241評論 0 0