iT邦幫忙

DAY 30
1

IT工作好玩某系列 第 31

第三十天 - Generating Objects with Object create [試寫技術文]

  • 分享至 

  • xImage
  •  

與其說是技術文,比較像是技術翻譯文...


影片:https://www.youtube.com/watch?v=Y4dtUOOqRWE&list=PLrzrNeNx3kNHsaPfrpPo0AlW-MhJE6gOA&index=11

另一種可以create javascript的方法就是用create()方法(method),這是ECMAscript5的規格

var foo = {};

var bar = Object.create(Object.prototype);
//這寫法比實字(literal)寫法長多了,但他的功能可厲害惹

這個功能那就是 --

他允許你創造物件時可以依據另一個物件的

來舉個比較複雜的例子,有一個名叫johnDoe的物件

var johnDoe = {
	firstName: "John",
	lastName: "Doe",
	sayName: function() {
	    return "My name is" + this.firstName + " " + this.lastName;
	}
};

技術上來說,javascript沒有method(方法),他是property(屬性)擁有一個function物件
所以接下來所說的method就是指這種屬性裡含有function的作法

接下來我們來創造一個janeDoe物件,同樣也擁有firstName和lastName屬性和sayName方法
除了直接複製貼上外,就是要來使用今天講的create方法,並以johnDoe物件為基礎

馬上來創造一個variable(變數),名為janeDoe
因為我們希望新的物件裡,firstName為"Jane",因為他們同姓且也都需要一個sayName,
所以現在僅需要改firstName的部分

那麼應該怎麼改呢?

var janeDoe = Object.creat(johnDoe, {
	firstName: { value: "Jane" }
});
//第二個argument(參數)便是打入你要更改使用的property以及其值(object descriptor物件描述符號)

現在把他們印出來

alert(johnDoe.sayName());
//跳出視窗"My name is Jahn Doe"
alert(janeDoe.sayName());
//跳出視窗"My name is Jane Doe"

我們來試試在janeDoe物件裡加入新的屬性/方法,名為greet:

var janeDoe = Object.creat(johnDoe, {
	firstName: { value: "Jane" },
    greet: function(name){
        return "Hello," + name;
    }
});

這個greet方法只給janeDoe物件,johnDoe則維持原樣
接下來再建一個叫jimSimth的物件,並以janeDoe物件為基礎
把三個都寫齊如下:

var johnDoe = {
	firstName: "John",
	lastName: "Doe",
	sayName: function() {
	    return "My name is" + this.firstName + " " + this.lastName;
	}
};

var janeDoe = Object.create(johnDoe, {
	firstName: { value: "Jane" },
    greet: function(person){
        return "Hello," + person.firstName;
    }
});

var jimSmith = Object.create(janeDoe, {
	firstName: { value: "Jim" },
	lastName: { value:"Smith" }
});
//這次firstName跟lastName都要改

現在來印出來試試看

alert(johnDoe.sayName());
//視窗跳出"My Name is John Doe"
alert(janeDoe.sayName() + "" + janeDoe.greet(johnDoe));
//沒跳出來
alert(jimSmith.sayName() + "" + jimSmith.greet(janeDoe));
//沒跳出來

//chrome console: Uncaught TypeError: Property 'greet' of object #<Object> is not a function

哈哈,出現一個我沒看過的錯誤
要怎麼改呢?

var johnDoe = {
	firstName: "John",
	lastName: "Doe",
	sayName: function() {
	    return "My name is" + this.firstName + " " + this.lastName;
	}
};

var janeDoe = Object.create(johnDoe, {
	firstName: { value: "Jane" },
    greet: {
        value : function(person){
        return "Hello," + person.firstName;
        }
    }
});
//原來是greet屬性要使用object descriptor物件描述符號方式來寫

var jimSmith = Object.create(janeDoe, {
	firstName: { value: "Jim" },
	lastName: { value:"Smith" }
});

印出來:

alert(johnDoe.sayName());
//視窗跳出"My Name is John Doe"
alert(janeDoe.sayName() + "" + janeDoe.greet(johnDoe));
//視窗跳出"My name is Jane Doe Hello, John"
alert(jimSmith.sayName() + "" + jimSmith.greet(janeDoe));
//視窗跳出"My name is Jim Smith Hello, Jane"

原理是什麼呢?
Object.create()所做的是建立一個prototype chain(原型鏈)
所以在create method括號中的第一個參數就是在你要的新物件上設定的protoype
因此我們可以說janeDoe的prototype就是johnDoe,jimSmith的prototype就是janeDoe

驗證一下

console.log(janeDoe.__proto__ === johnDoe);
//console印出"true"
console.log(jimSmith.__proto__ === janeDoe);
//console印出"true"

不過事實上我們寫code不會想要一直用create method
還是會使用物件實字的方法,用同樣的介面(都一樣有firstName, lastName, sayName,另一個物件有greet
$#@^T#%@$@#(有一段聽不太懂)
另一種pattern叫做constructor, 這也是下個部分會講的


學到的單字:
incept 取得
inception 全面啟動
terminology 術語


第三十天了...小小的感傷

為了寫技術文,早早8點半就在電腦前準備

雖然中間一直不斷的分心,但還是終於聽完了,很喜歡這個系列,只有短短的五分鐘

正適合英文還需要加強的我聽,5分鐘也正好是我能聽完的時間

之後會繼續看完它並寫筆記,本來是寫這篇之前希望開好網誌來告訴大家,不過還沒準備好只好做罷

相信有緣還會相見,然後現在其實有點無法想像我已經寫滿30天了,時間過的真快,

這三十天來的心得,前幾篇多多少少都有寫過了,從一開始就是希望養成寫文的習慣,到今日也算完成半個願望了

接下來就是在非強迫的情況下還能繼續寫文

未來會把這裡寫過的文章稍微整理一下,改一改,把不錯的文章放在自己的網誌裡

很喜歡寫文的感覺,莫忘現在的感覺阿!!

大家一起在coding的路上發光發熱吧!!


上一篇
第二十九天 - 這個月學js design pattern之後...
系列文
IT工作好玩某31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言