js关于对象那点事

js关于对象那点事

每到情人节苦逼的程序猿开始给本身找乐子。前端

呵 我没有对象 我能够new一个,做为前端更嗨了,万物皆对象。 咱们也有new 那什么是new呢。bash

咱们回到js设计之初,js的设计没有设计class的概念,这又涉及到原型和继承的概念。函数

咱们一步一步来new对象。ui

首先,咱们先看最简单定义对象,最多见this

var person = new Object();
person.name = 'Lily';
person.sex = 'female';
person.job = 'office lady'; // 这是个正经职业
复制代码

咱们这么定义了个对象,可是这就定死了,没有活力。spa

咱们要找一个活泼可爱的怎么办呢。那就经过一类人来找吧。prototype

咱们应该这么找:设计

  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是大相径庭的两我的,虽然都是经过一类人来找的,但接下来的这种找法就要三思了code

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
}
复制代码

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

相关文章
相关标签/搜索