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
咱们应该这么找:设计
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是大相径庭的两我的,虽然都是经过一类人来找的,但接下来的这种找法就要三思了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
}
复制代码
干了好多事儿了,之后咱们再慢慢说这对象的事,先好好相处一下~