js關于對象那點事

js關于對象那點事

每到情人節苦逼的程序猿開始給自己找樂子。

呵 我沒有對象 我可以new一個,作為前端更嗨了,萬物皆對象。
我們也有new 那什么是new呢。

我們回到js設計之初,js的設計沒有設計class的概念,這又涉及到原型和繼承的概念。

我們一步一步來new對象。

首先,我們先看最簡單定義對象,最常見

var person = new Object();
person.name = 'Lily';
person.sex = 'female';
person.job = 'office lady'; // 這是個正經職業

我們這么定義了個對象,但是這就定死了,沒有活力。

我們要找一個活潑可愛的怎么辦呢。那就通過一類人來找吧。

我們應該這么找:

  1. 先找到一類人
function Person(name,sex,job) {
    this.name = name
    this.sex = sex // 不是找對象么,為啥要定義性別?咱也可能是程序媛,還不能找男朋友了嗎
    this.job = job
}
  1. 然后根據我們的想法找
var myGirlFriend1 = new Person('Lily','female','office lady')
var myGirlFriend2 = new Person(...) // 咱提倡專一一點,不要對邊new第二個

咱們這找沒什么問題,當然要注意一點,這個時候myGirlFriend1和myGirlFriend2是截然不同的兩個人,雖然都是通過一類人來找的,但接下來的這種找法就要三思了

function Person(sex) {
}
Person.prototype.name = 'Lily'
Person.prototype.sex = 'female'
Person.prototype.job = 'office lady'

var myGirlFriend1 = new Person()

為啥呢,因為你這么找,別人也能這么找,可能找到的就是同一個人了,(愛是一道光),不管我事了噢,三思,三思

好像這過程中多了點什么 prototype 這是個什么東西,為啥這樣就有點慌了呢

這就是原型了,越扯越遠了,我們慢慢來,先解決好對象問題

我們和對象相處,經常要遇到一個問題,對象有什么喜好呀,有什么毛病呀,兩個人會不會吵架呀,我們來查看一下

const obj = {
  Lily: {
    name: 'Lily',
    hobit: {
      talk: 'somethings'
      eat: {
        vegetable: 'tomato',
        meat: beef,
        doing: null
      }
    }
  }
}
// 我們簡單寫下簡單喜好

什么時候最容易吵架呢,肯定是喋喋不休啦,所以我們要判斷一下對象有沒有這問題,也就是找一下有沒有

我們自己找個方法,來找一下這個環

function cycleDetector(obj) {
    let hasCycle = false;
    let arr = [];
    (function (obj) { // 立即執行函數做循環判斷
        const keys = Object.keys(obj) // 羅列出各項
        for (const key in obj) {
            const val = obj[key] // 拿出具體的值
            if(typeof val === 'object' && val !== null){ // null的typeof 也是object 神奇了 所以要單獨放
                const ind = arr.indexOf(val)
                if (ind < 0) {
                    arr.push(val)
                    arguments.callee(val)
                } else {
                    hasCycle = true
                    break
                }
            } // 咦 這里考慮else好像能干另外一件有趣的事呢
        }
    })(obj)
    return hasCycle
}

這下我們就能安心的處對象了,什么要驗證一下?你這樣試試看,吵不吵的起來

obj.Lily.hobit.eat.doing = obj.Lily //她喜歡邊吃邊說自己

看看我們用的方法里,好像能做另一件事。對咯,兩個人相處愉快,照張照片做留念,咱可以把對象扁平化一下

function objectFlat(obj) {
    let flat = [];
    // 簡單判斷是否有環
    try {
        JSON.parse(JSON.stringify(obj)) //利用Json.stringify特性 有環會報異常
    } catch (error) {
        console.log('有環,終止');
        return
    }
    (function (obj) {
        const keys = Object.keys(obj)
        for(const key in obj){
            const val = obj[key]
            if (typeof val !== 'object' || val === null) {
                flat.push(val)
            }else{
                // 如果還存在下級則遞歸
                arguments.callee(val)
            }
        }
    })(obj)
    return flat
}

干了好多事兒了,以后我們再慢慢說這對象的事,先好好相處一下~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 0. 寫在前面 當你開始工作時,你不是在給你自己寫代碼,而是為后來人寫代碼。 —— Nichloas C. Zak...
    康斌閱讀 5,357評論 1 42
  • 文/千年一眼 01) 今日晨讀文《薄荷糖,舊時光,青春未死,舊歌未央》乃本周領讀人青衣對平臺共讀書《人間詞話》所作...
    千年一眼閱讀 234評論 0 4
  • 我望暖春清晨的露 露清澈而透亮 我望炎夏午后的雨 雨暴躁且慌張 我望涼秋傍晚的落葉 落葉干枯有如落暉昏黃 我望寒冬...
    尋夢人阿T閱讀 260評論 1 3
  • 干蠢事時偷懶是一種美德。 -——消失的地平線
    阿拉拉彭閱讀 258評論 0 0
  • 今天是個下雨天?,剛好適合室內拿杯摩卡曬曬心情 今天講述一杯咖啡的故事-if if家族呢...
    一捻柚子閱讀 872評論 0 0