---
# System prepended metadata

title: 物件實字與建構式 & CallBack
tags: [JavaScript, 物件實字]

---

#  物件實字與建構式 & CallBack
>編輯整理: Jung
>參考來源:[小雕雕的家](https://sweeteason.pixnet.net/blog/post/40359127#callback)
>尚未整理來源 :[OneJar](https://ithelp.ithome.com.tw/articles/10208316?sc=iThelpR)
## 物件的建立
```javascript=
var house = new Object();
house.color = "white";
house.doors = 6;
house.room = 4;
house.doorNum = function(){
  alert(this.room);
}
house.doorNum();
```

但是現在可以改用實字的方式建立，結構會更清楚喔
```javascript=
var house = {
  color : "white",
  doors : 6,
  room : 4,
  doorNum : function() {
    alert(this.room);
  }
}
house.doorNum();
```
另一個使用實字的原因，如果你在區域範圍內用 Object 去建構的話

假設你外圍有相同名字的建構式，那解譯器會從你**呼叫Object() 的區域開始向外找
直到找到全域為止**

你也可以使用下面這種方式來自行定義建構函式
```javascript=

var Person = function (name) {
  this.name = name;
  this.say = function() {
    return "I am " + this.name;
  };
}

//建立
var adm = new Person("Adam");
adam.say(); // "I am Adam"
```
這個例子中每次 new Person() 的時候，一個新的say 函數就會建立在記憶體中
這樣非常浪費效能，因為每個物件的say() 方法都一樣，但卻在記憶體中有很多份

因此最好的寫法是把 say() 寫在物件的原型裡，如下
```javascript=
Person.prototype.say = function() {
  return "I am " + this.name;
};
```
所以日後如果有會重複利用到的方法或成員，都要盡量用prototype加入物件的原型中

 

那如果是陣列呢? 陣列也有陣列實字

```javascript=
var arr = new Array("a","b","c");

//改成陣列實字
var arr = ["a","b","c"];
```
好了，這下就超級清楚了~

從剛剛的 {color:"white"} 到陣列實字 ["a","b","c"]

組合起來不就是現在不用就退流行的 JSON 嗎

標準的 JSON 格式就是這樣啊!

{"color" : "white" , "some" : ["a","b","c"]}

習慣使用物件實字建構方式，從此不用再硬記 JSON 格式的長相了

## 執行的先後順序與Callback

有的時候執行一段 js 依照工作複雜度，返回的結果會有先後順序
這樣講有點模糊，就例如 AJAX 好了

```javascript=
function play() {
  $.ajax({
    url : 'test.html',
    success : function(){
      alert('第一名');
    }
  })
}

function play2() {
  alert('第二名');
}

//呼叫一下兩個 function 
play();
play2();
```
照裡來說應該要先跳出 '第一名' 然後再跳出 '第二名'

上面的結果會先跳出'第二名' 再跳出 '第一名'

因為跳出'第二名' 時，'第一名' 跑去test.html 還沒回來啊!

那要怎麼讓 '第二名' 在 '第一名'之後呢?

改成這樣就可以了
```javascript=
function play(callback) {
  $.ajax({
    url : 'test.html',
    success : function(res) {
      alert('第一名');
      callback();
    }
  })
}

function play2() {
  alert('第二名');
}

play(function() {
  play2();
});

//或是乾脆直接
play(function() {
  alert('第二名');
});
```

callback 是個好用的東西，在Node.js 裡面就運用了大量的 callback 

簡單來說 callback 就是把一個可以執行的函數傳入另一個方法的傳入參數中並執行

setTimeout 這東西大概就是大家最容易理解的 callback 範例了

```javascript=
setTimeout(function(){
  alert('3秒已過，懺悔吧你!');
},3000);

//或是這樣寫可能比較清楚
var msg = function () {
    alert('3秒已過，懺悔吧你!');
}
setTimeout(msg, 3000);
```

###### tags: `JavaScript` `物件實字`###### tags: `JavaScript` `物件實字`