標籤彙整:OBJECT

【JavaScript】子物件指定

説明

JS中有2種方式可以指定子物件。

方法一:dot連接

常用方法,利用dot連接母物件與子物件

const obj={
 akasha: 222,
 typhoon: 15151515,
 tks: "33333333"
}

console.log(obj.akasha); //222

方法二:中括號

母物件後面用中括號,中括號裡面可以用字串指定,或是用變數代換

const obj={
 akasha: 222,
 typhoon: 15151515,
 tks: "33333333"
}

//字串指定法
console.log(obj["akasha"]); //222

/*****************************/

//變數代換法
const typ = "typhoon";
console.log(obj[typ]); //15151515

 

物件導向

使用共同物件,做出其他很多的類似物件,簡化物件數

Object Types

聯想:貓咪有不同毛色,品種,但他們都是動物

1  建立基盤:改寫物件為建構子函數constrator function

//物件形式
var winstonTeen = {
    "nickname": "Winsteen",
    "age": 15,
    "x": 100,
    "y": 200
};
var winstonAdult = {
    "nickname": "Mr. Winst-a-lot",
    "age": 30,
    "x": 229,
    "y": 200
};

//建構子形式,改寫上方資料如下
var Winston = function(nickname, age, x, y) {
    this.nickname = nickname;
    this.age = age;
    this.x = x;
    this.y = y;
};

2  建構資料:用new 呼叫建構子函數

//物件形式
/*****************
var winstonTeen = {
    "nickname": "Winsteen",
    "age": 15,
    "x": 20,
    "y": 50
};
var winstonAdult = {
    "nickname": "Mr. Winst-a-lot",
    "age": 30,
    "x": 229,
    "y": 50
};
****************/

//建構子函數
var Winston = function(nickname, age, x, y) {
    this.nickname = nickname;
    this.age = age;
    this.x = x;
    this.y = y;
};

//new 呼叫建構子函數
var winstonTeen = new Winston("Winsteen", 15, 100, 200);
var winstonAdult = new Winston("Mr. Winst-a-lot", 30, 229, 200);
//之後可以用WinstonTeen/winstonAdult呼叫物件資料
//Winston.nickname→"Winsteen"

現在物件資料模型建構完成了,但還沒有連接上畫圖函數,所以看不到東西

Object Methods

聯想:貓咪除了會鳴叫還會吃飯

Methods:利用prototype原型,連接建構子與畫圖(或其他)函數,使資料具現化

//建構子←資料屬性
var Winston = function(nickname, age, x, y) {
 this.nickname = nickname;
 this.age = age + "yrs old";
 this.x = x;
 this.y = y;
};

background(255, 255, 255);
//1.1 prototype 連接建構子與畫圖函數←行為
//1.2 裡面的物件資料要用this指定
Winston.prototype.draw = function() {
 // face
 fill(255, 255, 0);
 ellipse(this.x, this.y, 90, 90);
 fill(46, 46, 41);
 // eyes
 ellipse(this.x - 20, this.y - 20, 15, 15);
 ellipse(this.x + 24, this.y - 25, 15, 15);
 fill(252, 65, 65);
 // mouth
 ellipse(this.x + 13, this.y + 18, 40, 40);

 //txt
 var txt = this.nickname + ", " + this.age;
 text(txt, this.x - 40, this.y - 60);
};

//3 嘗試接其他函數:talk
Winston.prototype.talk = function() {
 text("I'm Winston!", this.x - 30, this.y + 70);
};

//new 呼叫建構子函數
var winstonTeen = new Winston("Winsteen", 15, 100, 200);
var winstonAdult = new Winston("Mr. Winst-a-lot", 30, 229, 200);

//2 prototype接好後,呼叫draw
winstonTeen.draw();
winstonAdult.draw();

//4 呼叫talk函數
winstonTeen.talk();
winstonAdult.talk();
Display

參考:ProcessingJS呈現在網頁的方法
12345678999999999999999999999999999999999999999

See the Pen OOD by Ian Chen (@ianchen0419) on CodePen.

Object Inheritance

聯想:貓咪會鳴叫,狗狗會吠叫,但他們都是相似動物,一樣會吃飯,睡覺,有年齡。

ood

  1. 建立母親建構子(共同資料屬性)
  2. 母親建構子的Method(共同行為)
  3. 建立小孩1建構子,用call宣告繼承母親的資料屬性
  4. 補足小孩1的獨特資料屬性
  5. create宣告繼承母親的Method行為
  6. 補足小孩1的獨特Method行為
  7. 同3456,建立小孩2建構子
  8. 資料建構完畢,開始印出來
  9. 用new呼叫各小孩自己的建構子
canvas#mycanvas
   /************************
   ****母親區Creature*******
   ************************/
  background(255, 255, 255);
  //1 Creature 共通資料屬性母建構子
  var Creature = function(nickname, age, x, y) {
   this.nickname = nickname;
   this.age = age + "yrs old";
   this.x = x;
   this.y = y;
  };
  //2 Creature Method  母建構子的共通行為
  Creature.prototype.talk = function() {
   text("SUPPP!?!?!?!??!", this.x - 40, this.y + 70);
  };

  /************************
   ****小孩1區Hopper********
   ************************/

  //3 繼承母資料屬性
  var Hopper = function(nickname, age, x, y) {
   //call後面是母資料屬性的資料
   Creature.call(this, nickname, age, x, y);

   //4 省略小孩獨特資料屬性
   //補充:增加小孩獨特資料屬性方法
   //this.cover = cover;
  };
  //5 繼承母行為method
  Hopper.prototype = Object.create(Creature.prototype);

  //6.1 增加小孩獨特行為method
  Hopper.prototype.draw = function() {

   //face
   fill(230, 230, 250);
   ellipse(this.x, this.y, 60, 100);

   //eyes
   fill(0, 0, 0);
   line(this.x + 10, this.y - 25, this.x + 25, this.y - 25);
   line(this.x - 10, this.y - 25, this.x + 5, this.y - 25);

   //month
   fill(252, 65, 65);
   triangle(this.x, this.y + 20, this.x + 10, this.y + 10, this.x + 20, this.y + 20);
   //txt
   fill(0, 0, 139);
   var txt = this.nickname + ", " + this.age;
   text(txt, this.x - 40, this.y - 60);
  };
  //6.2 增加小孩獨特行為2
  Hopper.prototype.hooray = function() {
   text("Hooooray!!!", this.x - 30, this.y + 70);
  };

  /************************
   ****小孩2區Winston********
   ************************/

  //3 繼承母資料屬性
  var Winston = function(nickname, age, x, y) {
   Creature.call(this, nickname, age, x, y);
  };

  //4 省略小孩獨特資料屬性
  //5 繼承母行為method
  Winston.prototype = Object.create(Creature.prototype);

  //6 增加小孩獨特行為method
  Winston.prototype.draw = function() {
   // face
   fill(255, 255, 0);
   ellipse(this.x, this.y, 90, 90);
   // eyes
   fill(46, 46, 41);
   ellipse(this.x - 20, this.y - 20, 15, 15);
   ellipse(this.x + 24, this.y - 25, 15, 15);
   // mouth
   fill(252, 65, 65);
   ellipse(this.x + 13, this.y + 18, 40, 40);
   var txt = this.nickname + ", " + this.age;
   text(txt, this.x - 50, this.y - 60);
  };

  /**********資料建構完畢,下面印出來*************/

  /******呼叫Hopper跟Hopper2.0*********/

  //A 呼叫資料(等於建立小孩的物件資料)
  var lilHopper = new Hopper("Little Hopper", 15, 50, 240);
  var bigHopper = new Hopper("Big Hopper", 30, 50 + 200, 240);
  //B 呼叫行為(實體化)
  bigHopper.draw();
  bigHopper.hooray();
  lilHopper.draw();
  lilHopper.talk();

  /******呼叫Winston跟Winston2.0*********/

  //A 呼叫資料(等於建立小孩的物件資料)
  var winstonTeen = new Winston("Winsteen", 15, 50, 70);
  var winstonAdult = new Winston("Mr. Winst-a-lot", 30, 50 + 200, 70);
  //B 呼叫行為(實體化)
  winstonTeen.draw();
  winstonTeen.talk();
  winstonAdult.draw();
Display

See the Pen OOD2 by Ian Chen (@ianchen0419) on CodePen.

Ajax

説明

使用外部(後台)資料,不用自己建構資料模型。

步驟

  1. 使用ajax串接後台api
  2. 印出資料,success:成功
  3. 將function内資料外接
  4. 之後使用tododata變數,可以在外部編輯這筆資料

範例

div#notify
// 3 將function内資料外接
var tododata;

// 1 使用ajax串接後台api
$.ajax(
 {
  url: "https://goo.gl/PBvlqI",
 // 2 印出資料,success:成功
  success: function(res){
   $("#notify").text(res);
   tododata=res;
  }
 }
);

// 4 之後使用tododata變數,可以在外部編輯這筆資料
Display

(按下載入不安全的代碼後顯示)

應用:JSON與ajax結合

  1. 製作html清單模板
  2. 定義外部api
  3. ajax串接,ajax裡面是物件形式
    • 連接url變數
    • 成功:傳回參數→結果→外接
    • JSON.parse(文字)→物件結構
  4. 製作迴圈,準備列印資料
    • 迴圈下的api資料
    • 代換變數
    • 載入代換後的新模板
  5. 建立打勾項目
    • 取代class
    • 定義打勾class
.todolist
 h3 我的代辦清單
 hr
 ul#listitem
 //li(class="{{class}}") {{num}}. {{name}} {{date}}
*
font-family: 微軟正黑體
 
body
 padding: 30px

.todolist
 display: inline-block
 padding: 20px
 border: solid 3px
 
 & ul
  padding: 0px

 & li
  list-style: none
  width: 300px
  padding: 5px

 .done
  &:before
  content: " ✔ "
  color: red
// 1 製作html清單模板
var html="<li class='{{class}}'>{{num}}.{{name}} {{date}}</li>";
// 2 定義外部api
var api="https://goo.gl/PBvlqI";
// 3.3 定義外接資料
var data;

// 3 ajax串接,ajax裡面是物件形式
$.ajax({
 // 3.1 連接url變數
 url: api,
 // 3.2 成功:傳回參數→結果→外接
 success: function(res){
 // 3.3 JSON.parse(文字)→物件結構
 // console.log(JSON.parse(res));
 data=JSON.parse(res);
 
 // 4 製作迴圈,準備列印資料
 for(i=0;i<data.length;i++){
 // 4.1 迴圈下的api資料
 var item=data[i]
 // 5.2 定義打勾class
 // if簡寫(檢査項目==true)?"是的話傳値":"否的話傳値"
 var now_class=(item.done)==true?"done":"";
 
 
 // 4.2 代換變數
 var new_html=
 html.replace("{{num}}",i+1)
 .replace("{{name}}",item.name)
 .replace("{{date}}",item.date)
 // 5 建立打勾項目
 // 5.1 取代class
 .replace("{{class}}",now_class);
 
 // 4.3 載入代換後的新模板
 $("#listitem").append(new_html);
 }
 }
});
Display

CODEPEN

陣列與物件

陣列[]:依照編號排排站好的資料

  1. 宣告陣列[]
  2. 編號資料
  3. 利用push,新增資料
  4. 開始列印資料
ul#menu
// 1宣告陣列
var menu=[];

// 2編號資料
menu[0]="東坡肉炒飯";
menu[1]="葱爆羊肉";
menu[2]="花式炒鮭魚";

// 3利用push,新增資料
menu.push("新疆烤山豬");

// 4開始列印資料
$("#menu").append("<li>"+menu[0]+"</li>");
$("#menu").append("<li>"+menu[1]+"</li>");
$("#menu").append("<li>"+menu[2]+"</li>");
$("#menu").append("<li>"+menu[3]+"</li>");

陣列進階:簡寫方法

var menu = [];

// 1 編號資料簡寫,簡化以下資料
// menu_json[0]="東坡肉炒飯";
// menu_json[1]="葱爆羊肉";
// menu_json[2]="花式炒鮭魚";

// *毎筆資料用逗號隔開
menu = ["東坡肉炒飯", "葱爆羊肉", "花式炒鮭魚"];

menu.push("新疆烤山豬");

// 2 列印資料簡寫,利用迴圈for制定規則
// $("#menu_json").append("<li>"+menu_json[0]+"</li>");
// $("#menu_json").append("<li>"+menu_json[1]+"</li>");
// $("#menu_json").append("<li>"+menu_json[2]+"</li>");
// $("#menu_json").append("<li>"+menu_json[3]+"</li>");

// 迴圈變數(開始;結束;規則)
for (var i = 0; i < 4; i++) {
 // debug: console.log(i);
 $("#menu").append("<li>" + menu[i] + "</li>");
}

陣列進階2:自動判斷資料長度

var menu = [];

menu = ["東坡肉炒飯", "葱爆羊肉", "花式炒鮭魚"];

menu.push("新疆烤山豬");

// 迴圈結束値使用menu.length
for (var i = 0; i < menu.length; i++) {
 $("#menu").append("<li>" + menu[i] + "</li>");
}

物件{}:毎一項資料都有名字的陣列

  1. 定義物件
  2. 編寫物件
  3. 列印物件
ul#shop
// 1 定義物件
var shop = {};

// 2 編寫物件
shop.name="阿東熱炒";
shop.addr="台北市宵夜路";
shop.phone="02 123456789";

// 3 列印物件
// 補充:列印物件方法二shop["name"]=shop.name
// 方法二使用時機,中括號裡面是變數或參數時使用
// shop.name只有當name是存在的物件名才可使用
$("#shop").append("<li>商店名稱:"+shop.name+"</li>");
$("#shop").append("<li>商店地址:"+shop.addr+"</li>");
$("#shop").append("<li>商店電話:"+shop.phone+"</li>");

物件進階:編寫物件簡寫

var shop = {};

// 編寫物件簡寫,簡化以下項目
// shop.name="阿東熱炒";
// shop.addr="台北市宵夜路";
// shop.phone="02 123456789";

// 用逗號區隔
shop={
 //屬性名稱有空格時需要"包起來
 //ex. "shop name": "阿東熱炒"
 name: "阿東熱炒",
 addr: "台北市宵夜路",
 phone: "02 123456789"
};


$("#shop").append("<li>商店名稱:"+shop.name+"</li>");
$("#shop").append("<li>商店地址:"+shop.addr+"</li>");
$("#shop").append("<li>商店電話:"+shop.phone+"</li>");

物件内的陣列&清單内的子清單

ul#shop
var shop = {};

// 1 物件内新增陣列
shop = {
 name: "阿東熱炒",
 addr: "台北市宵夜路",
 phone: "02 123456789",
 menu: ["東坡肉炒飯", "葱爆羊肉", "花式炒鮭魚"]
};

// 2 一樣可以用push,不過前面要+物件名
shop.menu.push("新疆烤山豬");

// 4 定義子清單變數
// 4.1 建立ul開始標籤
var menu_html = "<ul>";
// 4.2 製作内部迴圈
for(i = 0; i < shop.menu.length; i++){
 menu_html+="<li>"+shop.menu[i]+"</li>";
}
// 4.3 建立ul結束標籤
menu_html += "</ul>";

// 3 列印子陣列,先用menu_html借代,因為要做子清單
$("#shop").append("<li>商店名稱:" + shop.name + "</li>");
$("#shop").append("<li>商店地址:" + shop.addr + "</li>");
$("#shop").append("<li>商店電話:" + shop.phone + "</li>");
$("#shop").append("<li>商店菜單:" + menu_html + "</li>");

使用變數呼叫物件

必須要將整串變數連名帶姓地存成變數或參數

var car={brand: "Audi", color: "blue", foot: 4};

var s=car.brand;
console.log(brand); //Audi

//不可以這樣做↓
var s2=brand;
console.log(car.v2); //error

//呼叫變數的式子不管有多長,都不可以拆開
//要寫成像這樣→var s3=title.dataset.name
//參數同理