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
}

干了好多事儿了,以后我们再慢慢说这对象的事,先好好相处一下~

你可能感兴趣的:(js关于对象那点事)