js关于对象那点事
每到情人节苦逼的程序猿开始给自己找乐子。
呵 我没有对象 我可以new一个,作为前端更嗨了,万物皆对象。
我们也有new 那什么是new呢。
我们回到js设计之初,js的设计没有设计class的概念,这又涉及到原型和继承的概念。
我们一步一步来new对象。
首先,我们先看最简单定义对象,最常见
var person = new Object();
person.name = 'Lily';
person.sex = 'female';
person.job = 'office lady'; // 这是个正经职业
我们这么定义了个对象,但是这就定死了,没有活力。
我们要找一个活泼可爱的怎么办呢。那就通过一类人来找吧。
我们应该这么找:
- 先找到一类人
function Person(name,sex,job) {
this.name = name
this.sex = sex // 不是找对象么,为啥要定义性别?咱也可能是程序媛,还不能找男朋友了吗
this.job = job
}
- 然后根据我们的想法找
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
}
干了好多事儿了,以后我们再慢慢说这对象的事,先好好相处一下~