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
}
複製代碼
幹了好多事兒了,之後咱們再慢慢說這對象的事,先好好相處一下~