js原型鏈--js面向?qū)ο缶幊?/h1>

簡單粗暴地理解js原型鏈--js面向?qū)ο缶幊?/a>

開始前先說一句,寫代碼也可以進(jìn)來看看拣宰,看完再學(xué)習(xí)面向?qū)ο笮耍煌砼叮?/em>
原型鏈理解起來有點繞了放典,網(wǎng)上資料也是很多,每次晚上睡不著的時候總喜歡在網(wǎng)上找點原型鏈和閉包的文章看,效果極好奋构。

不要糾結(jié)于那一堆術(shù)語了壳影,那除了讓你腦筋擰成麻花,真的不能幫你什么弥臼。簡單粗暴點看原型鏈吧宴咧,想點與代碼無關(guān)的事,比如人径缅、妖以及人妖掺栅。

1)人是人他媽生的,妖是妖他媽生的纳猪。人和妖都是對象實例氧卧,而人他媽和妖他媽就是原型。原型也是對象兆旬,叫原型對象假抄。

2)人他媽和人他爸啪啪啪能生出一堆人寶寶、妖他媽和妖他爸啪啪啪能生出一堆妖寶寶丽猬,啪啪啪就是構(gòu)造函數(shù)宿饱,俗稱造人。

3)人他媽會記錄啪啪啪的信息脚祟,所以可以通過人他媽找到啪啪啪的信息谬以,也就是說能通過原型對象找到構(gòu)造函數(shù)。

4)人他媽可以生很多寶寶由桌,但這些寶寶只有一個媽媽为黎,這就是原型的唯一性。

5)人他媽也是由人他媽他媽生的行您,通過人他媽找到人他媽他媽铭乾,再通過人他媽他媽找到人他媽他媽……,這個關(guān)系叫做原型鏈娃循。

image

6)原型鏈并不是無限的炕檩,當(dāng)你通過人他媽一直往上找,最后發(fā)現(xiàn)你會發(fā)現(xiàn)人他媽他媽他媽……的他媽都不是人捌斧,也就是原型鏈最終指向null笛质。

7)人他媽生的人會有人的樣子,妖他媽生的妖會有妖的丑陋捞蚂,這叫繼承妇押。

image

8)你繼承了你媽的膚色,你媽繼承了你媽他媽的膚色姓迅,你媽他媽……敲霍,這就是原型鏈的繼承俊马。

9)你談對象了,她媽讓你帶上房產(chǎn)證去提貨色冀,你若沒有潭袱,那她媽會問你媽有沒有,你媽沒有那她媽會問你媽她媽有沒有……這就是原型鏈的向上搜索锋恬。

10)你會繼承你媽的樣子,但是你也可以去染發(fā)洗剪吹编丘,就是說對象的屬性可以自定義与学,會覆蓋繼承得到的屬性。

image

11)雖然你洗剪吹了染成黃毛了嘉抓,但你不能改變你媽的樣子索守,你媽生的弟弟妹妹跟你的黃毛洗剪吹沒一點關(guān)系,就是說對象實例不能改動原型的屬性抑片。

12)但是你家被你玩火燒了的話卵佛,那就是說你家你媽家你弟們家都被燒了,這就是原型屬性的共享敞斋。

13)你媽外號阿珍截汪,鄰居大娘都叫你阿珍兒,但你媽頭發(fā)從飄柔做成了金毛獅王后植捎,隔壁大嬸都改口叫你包租仔衙解,這叫原型的動態(tài)性。

image

14)你媽愛美焰枢,又跑到韓國整形蚓峦,整到你媽他媽都認(rèn)不出來,即使你媽頭發(fā)換回飄柔了济锄,但隔壁鄰居還是叫你金毛獅王子暑椰。因為沒人認(rèn)出你媽,整形后的你媽已經(jīng)回爐再造了荐绝,這就是原型的整體重寫一汽。

image

尼瑪!你特么也是夠了很泊! Don't BB角虫! Show me the code!

function Person (name) { this.name = name; }
function Mother () { }
Mother.prototype = {    //Mother的原型
    age: 18,
    home: ['Beijing', 'Shanghai']
};
Person.prototype = new Mother(); //Person的原型為Mother

//用chrome調(diào)試工具查看委造,提供了__proto__接口查看原型戳鹅,這里有兩層原型,各位還是直接看chrome好一點昏兆。
var p1 = new Person('Jack'); //p1:'Jack'; __proto__:{__proto__:18,['Beijing','Shanghai']}
var p2 = new Person('Mark'); //p2:'Mark'; __proto__:{__proto__:18,['Beijing','Shanghai']}
p1.age = 20;

 /* 實例不能改變原型的基本值屬性枫虏,正如你洗剪吹染黃毛跟你媽無關(guān)
 * 在p1實例下增加一個age屬性的普通操作,與原型無關(guān)。跟var o={}; o.age=20一樣隶债。
 * p1:下面多了個屬性age腾它,而__proto__跟 Mother.prototype一樣,age=18死讹。
 * p2:只有屬性name瞒滴,__proto__跟 Mother.prototype一樣
 */

 p1.home[0] = 'Shenzhen'; 
/* 原型中引用類型屬性的共享,正如你燒了你家赞警,就是燒了你全家的家
 * 這個先過妓忍,下文再仔細(xì)嘮叨一下可好?
 * p1:'Jack',20; __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 * p2:'Mark';    __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 */

 p1.home = ['Hangzhou', 'Guangzhou']; 
/* 其實跟p1.age=20一樣的操作愧旦。換成這個理解: var o={}; o.home=['big','house']
 * p1:'Jack',20,['Hangzhou','Guangzhou']; __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 * p2:'Mark';                             __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 */

delete p1.age;
 /* 刪除實例的屬性之后世剖,原本被覆蓋的原型值就重見天日了。正如你剃了光頭笤虫,遺傳的迷人小卷發(fā)就長出來了旁瘫。
 * 這就是向上搜索機制,先搜你琼蚯,然后你媽酬凳,再你媽他媽,所以你媽的改動會動態(tài)影響你凌停。
 * p1:'Jack',['Hangzhou','Guangzhou']; __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 * p2:'Mark';                          __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 */

 Person.prototype.lastName = 'Jin';
 /* 改寫原型粱年,動態(tài)反應(yīng)到實例中。正如你媽變新潮了罚拟,鄰居提起你都說你媽真潮台诗。
 * 注意,這里我們改寫的是Person的原型赐俗,就是往Mother里加一個lastName屬性拉队,等同于Mother.lastName='Jin'
 * 這里并不是改Mother.prototype,改動不同的層次阻逮,效果往往會有很大的差異粱快。
 * p1:'Jack',['Hangzhou','Guangzhou']; __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai']}
 * p2:'Mark';                          __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai']} 
 */

 Person.prototype = { 
    age: 28, 
    address: { country: 'USA', city: 'Washington' }
}; var p3 = new Person('Obama'); 
/* 重寫原型!這個時候Person的原型已經(jīng)完全變成一個新的對象了叔扼,也就是說Person換了個媽事哭,叫后媽。
 * 換成這樣理解:var a=10; b=a; a=20; c=a瓜富。所以b不變鳍咱,變得是c,所以p3跟著后媽變化与柑,與親媽無關(guān)谤辜。
 * p1:'Jack',['Hangzhou','Guangzhou']; __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai']}
 * p2:'Mark';                          __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai']}
 * p3:'Obama';__proto__: 28 {country: 'USA', city: 'Washington'}
 */

 Mother.prototype.no = 9527; 
/* 改寫原型的原型蓄坏,動態(tài)反應(yīng)到實例中。正如你媽他媽變新潮了丑念,鄰居提起你都說你丫外婆真潮涡戳。
 * 注意,這里我們改寫的是Mother.prototype脯倚,p1p2會變渔彰,但上面p3跟親媽已經(jīng)了無瓜葛了,不影響他推正。
 * p1:'Jack',['Hangzhou','Guangzhou']; __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai'],9527}
 * p2:'Mark';                          __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai'],9527}
 * p3:'Obama';__proto__: 28 {country: 'USA', city: 'Washington'} 
*/

 Mother.prototype = { 
    car: 2, 
    hobby: ['run','walk']
}; var p4 = new Person('Tony'); 
/* 重寫原型的原型胳岂!這個時候Mother的原型已經(jīng)完全變成一個新的對象了!人他媽換了個后媽舔稀!
 * 由于上面Person與Mother已經(jīng)斷開聯(lián)系了,這時候Mother怎么變已經(jīng)不影響Person了掌测。
 * p4:'Tony';__proto__: 28 {country: 'USA', city: 'Washington'}
 */

 Person.prototype = new Mother();
 //再次綁定
var p5 = new Person('Luffy'); 
// 這個時候如果需要應(yīng)用這些改動的話内贮,那就要重新將Person的原型綁到mother上了 
// p5:'Luffy';__proto__:{__proto__: 2, ['run','walk']}
 p1.__proto__.__proto__.__proto__.__proto__ 
//null,你說原型鏈的終點不是null汞斧?

Mother.__proto__.__proto__.__proto__   
 //null夜郁,你說原型鏈的終點不是null?

看完基本能理解了吧粘勒?

現(xiàn)在再來說說 p1.age = 20竞端、p1.home = ['Hangzhou', 'Guangzhou'] 和 p1.home[0] = 'Shenzhen' 的區(qū)別。 p1.home[0] = 'Shenzhen'; 總結(jié)一下是 p1.object.method庙睡,p1.object.property 這樣的形式事富。

p1.age = 20; p1.home = ['Hangzhou', 'Guangzhou'];這兩句還是比較好理解的,先忘掉原型吧乘陪,想想我們是怎么為一個普通對象增加屬性的:

var obj = new Object();
obj.name='xxx';
obj.num = [100, 200]

這樣是不是就理解了呢统台?一樣一樣的呀。

那為什么 p1.home[0] = 'Shenzhen' 不會在 p1 下創(chuàng)建一個 home 數(shù)組屬性啡邑,然后將其首位設(shè)為 'Shenzhen'呢贱勃? 我們還是先忘了這個,想想上面的obj對象谤逼,如果寫成這樣: var obj.name = 'xxx', obj.num = [100, 200]贵扰,能得到你要的結(jié)果嗎? 顯然流部,除了報錯你什么都得不到戚绕。因為obj還未定義,又怎么能往里面加入東西呢贵涵?同理列肢,p1.home[0]中的 home 在 p1 下并未被定義恰画,所以也不能直接一步定義 home[0] 了。如果要在p1下創(chuàng)建一個 home 數(shù)組瓷马,當(dāng)然是這么寫了:

p1.home = []; 
p1.home[0] = 'Shenzhen';

這不就是我們最常用的辦法嗎拴还?

而之所以 p1.home[0] = 'Shenzhen' 不直接報錯,是因為在原型鏈中有一個搜索機制欧聘。當(dāng)我們輸入 p1.object 的時候片林,原型鏈的搜索機制是先在實例中搜索相應(yīng)的值,找不到就在原型中找怀骤,還找不到就再往上一級原型中搜索……一直到了原型鏈的終點费封,就是到null還沒找到的話,就返回一個 undefined蒋伦。當(dāng)我們輸入 p1.home[0] 的時候弓摘,也是同樣的搜索機制,先搜索 p1 看有沒有名為 home 的屬性和方法痕届,然后逐級向上查找韧献。最后我們在Mother的原型里面找到了,所以修改他就相當(dāng)于修改了 Mother 的原型啊研叫。

一句話概括:p1.home[0] = 'Shenzhen' 等同于 Mother.prototype.home[0] = 'Shenzhen'锤窑。

由上面的分析可以知道,原型鏈繼承的主要問題在于屬性的共享嚷炉,很多時候我們只想共享方法而并不想要共享屬性渊啰,理想中每個實例應(yīng)該有獨立的屬性。因此申屹,原型繼承就有了下面的兩種改良方式:

1)組合繼承

 function Mother (age) {
    this.age = age;
    this.hobby = ['running','football']
}
Mother.prototype.showAge = function () {
    console.log(this.age); 
};

function Person (name, age) { 
    Mother.call(this, age);  //第二次執(zhí)行
    this.name = name; 
}
Person.prototype = new Mother();  //第一次執(zhí)行
Person.prototype.constructor = Person;
Person.prototype.showName = function () {
    console.log(this.name);
}

var p1 = new Person('Jack', 20); 
p1.hobby.push('basketball');  //p1:'Jack'; __proto__:20,['running','football']
var p2 = new Person('Mark', 18);  //p2:'Mark'; __proto__:18,['running','football']

結(jié)果是醬紫的:

image
image

這里第一次執(zhí)行的時候绘证,得到 Person.prototype.age = undefined, Person.prototype.hobby = ['running','football'],第二次執(zhí)行也就是 var p1 = new Person('Jack', 20) 的時候独柑,得到 p1.age =20, p1.hobby = ['running','football']迈窟,push后就變成了 p1.hobby = ['running','football', 'basketball']。其實分辨好 this 的變化忌栅,理解起來也是比較簡單的车酣,把 this 簡單替換一下就能得到這個結(jié)果了。 如果感覺理解起來比較繞的話索绪,試著把腦子里面的概念扔掉吧湖员,把自己當(dāng)瀏覽器從上到下執(zhí)行一遍代碼,結(jié)果是不是就出來了呢瑞驱?

通過第二次執(zhí)行原型的構(gòu)造函數(shù) Mother()娘摔,我們在對象實例中復(fù)制了一份原型的屬性,這樣就做到了與原型屬性的分離獨立唤反。細(xì)心的你會發(fā)現(xiàn)凳寺,我們第一次調(diào)用 Mother()鸭津,好像什么用都沒有呢,能不調(diào)用他嗎肠缨?可以逆趋,就有了下面的寄生組合式繼承。

2)寄生組合式繼承

function object(o){
    function F(){}
    F.prototype = o;
    return new F();
}

function inheritPrototype(Person, Mother){
    var prototype = object(Mother.prototype); 
    prototype.constructor = Person;    
    Person.prototype = prototype;    
}
                        
function Mother (age) {
    this.age = age;
    this.hobby = ['running','football']
}
Mother.prototype.showAge = function () {
    console.log(this.age); 
};

function Person (name, age) { 
    Mother.call(this, age);
    this.name = name; 
}

inheritPrototype(Person, Mother);

Person.prototype.showName = function () {
    console.log(this.name);
}

var p1 = new Person('Jack', 20); 
p1.hobby.push('basketball');//p1:'Jack'; __proto__:20,['running','football']
var p2 = new Person('Mark', 18); //p2:'Mark'; __proto__:18,['running','football']

結(jié)果是醬紫的:

image
image

原型中不再有 age 和 hobby 屬性了晒奕,只有兩個方法闻书,正是我們想要的結(jié)果!

關(guān)鍵點在于 object(o) 里面脑慧,這里借用了一個臨時對象來巧妙避免了調(diào)用new Mother()魄眉,然后將原型為 o 的新對象實例返回,從而完成了原型鏈的設(shè)置闷袒。很繞坑律,對吧,那是因為我們不能直接設(shè)置 Person.prototype = Mother.prototype 啊囊骤。

小結(jié)


說了這么多脾歇,其實核心只有一個:屬性共享和獨立的控制,當(dāng)你的對象實例需要獨立的屬性淘捡,所有做法的本質(zhì)都是在對象實例里面創(chuàng)建屬性。若不考慮太多池摧,你大可以在Person里面直接定義你所需要獨立的屬性來覆蓋掉原型的屬性焦除。總之作彤,使用原型繼承的時候膘魄,要對于原型中的屬性要特別注意,因為他們都是牽一發(fā)而動全身的存在竭讳。

下面簡單羅列下js中創(chuàng)建對象的各種方法创葡,現(xiàn)在最常用的方法是組合模式,熟悉的同學(xué)可以跳過到文章末尾點贊了绢慢。

1)原始模式

//1.原始模式灿渴,對象字面量方式
var person = { 
    name: 'Jack',
    age: 18,
    sayName: function () { alert(this.name); }
};
//1.原始模式,Object構(gòu)造函數(shù)方式
var person = new Object();
person.name = 'Jack';
person.age = 18;
person.sayName = function () {
    alert(this.name);
};

顯然胰舆,當(dāng)我們要創(chuàng)建批量的person1骚露、person2……時,每次都要敲很多代碼缚窿,資深copypaster都吃不消棘幸!然后就有了批量生產(chǎn)的工廠模式。

2)工廠模式

 //2.工廠模式倦零,定義一個函數(shù)創(chuàng)建對象
function creatPerson (name, age) {
    var person = new Object(); 
    person.name = name;
    person.age = age;
    person.sayName = function () {
        alert(this.name);
    };
    return person; 
}

工廠模式就是批量化生產(chǎn)误续,簡單調(diào)用就可以進(jìn)入造人模式(啪啪啪……)吨悍。指定姓名年齡就可以造一堆小寶寶啦,解放雙手蹋嵌。但是由于是工廠暗箱操作的育瓜,所以你不能識別這個對象到底是什么類型、是人還是狗傻傻分不清(instanceof 測試為 Object)欣尼,另外每次造人時都要創(chuàng)建一個獨立的temp對象爆雹,代碼臃腫,雅蠛蝶啊愕鼓。

3)構(gòu)造函數(shù)

//3.構(gòu)造函數(shù)模式钙态,為對象定義一個構(gòu)造函數(shù)
function Person (name, age) {
    this.name = name;
    this.age = age;
    this.sayName = function () {
        alert(this.name);
    };    
}
var p1 = new Person('Jack', 18); //創(chuàng)建一個p1對象
Person('Jack', 18);    //屬性方法都給window對象,window.name='Jack'菇晃,window.sayName()會輸出Jack

構(gòu)造函數(shù)與C++册倒、JAVA中類的構(gòu)造函數(shù)類似,易于理解磺送,另外Person可以作為類型識別(instanceof 測試為 Person 驻子、Object)。但是所有實例依然是獨立的估灿,不同實例的方法其實是不同的函數(shù)崇呵。這里把函數(shù)兩個字忘了吧,把sayName當(dāng)做一個對象就好理解了馅袁,就是說張三的 sayName 和李四的 sayName是不同的存在域慷,但顯然我們期望的是共用一個 sayName 以節(jié)省內(nèi)存。

4)原型模式

//4.原型模式汗销,直接定義prototype屬性
function Person () {}
Person.prototype.name = 'Jack';
Person.prototype.age = 18;
Person.prototype.sayName = function () { alert(this.name); };
//4.原型模式犹褒,字面量定義方式
function Person () {}
Person.prototype = {
    name: 'Jack',
    age: 18,
    sayName: function () { alert(this.name); }
};
var p1 = new Person(); //name='Jack'
var p2 = new Person(); //name='Jack'

這里需要注意的是原型屬性和方法的共享,即所有實例中都只是引用原型中的屬性方法弛针,任何一個地方產(chǎn)生的改動會引起其他實例的變化叠骑。

5)混合模式(構(gòu)造+原型)

//5. 原型構(gòu)造組合模式,
function Person (name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype = {
    hobby: ['running','football'];
    sayName: function () { alert(this.name); },
    sayAge: function () { alert(this.age); }
};
var p1 = new Person('Jack', 20); 
//p1:'Jack',20; __proto__: ['running','football'],sayName,sayAge
var p2 = new Person('Mark', 18); 
//p1:'Mark',18;__proto__: ['running','football'],sayName,sayAge

做法是將需要獨立的屬性方法放入構(gòu)造函數(shù)中削茁,而可以共享的部分則放入原型中宙枷,這樣做可以最大限度節(jié)省內(nèi)存而又保留對象實例的獨立性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末茧跋,一起剝皮案震驚了整個濱河市朦拖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厌衔,老刑警劉巖璧帝,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異富寿,居然都是意外死亡睬隶,警方通過查閱死者的電腦和手機锣夹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苏潜,“玉大人银萍,你說我怎么就攤上這事⌒糇螅” “怎么了贴唇?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長飞袋。 經(jīng)常有香客問我戳气,道長,這世上最難降的妖魔是什么巧鸭? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任瓶您,我火速辦了婚禮呀袱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郑叠。我一直安慰自己,他們只是感情好乡革,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布油吭。 她就那樣靜靜地躺著署拟,像睡著了一般类咧。 火紅的嫁衣襯著肌膚如雪痕惋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死财破,一個胖子當(dāng)著我的面吹牛狈究,可吹牛的內(nèi)容都是我干的碎罚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宫峦,長吁一口氣:“原來是場噩夢啊……” “哼导绷!你這毒婦竟也來了妥曲?” 一聲冷哼從身側(cè)響起志衣,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壳坪,沒想到半個月后九孩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡她君,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡退客,死狀恐怖档玻,靈堂內(nèi)的尸體忽然破棺而出凉当,到底是詐尸還是另有隱情挟伙,我是刑警寧澤携悯,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響包竹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜膏萧,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一漓骚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榛泛,春花似錦蝌蹂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沛简,卻和暖如春齐鲤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椒楣。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工给郊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捧灰。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓淆九,卻偏偏與公主長得像,于是被迫代替她去往敵國和親毛俏。 傳聞我的和親對象是個殘疾皇子炭庙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容