摘要:普通函數(shù)中的在中,凡是沒有定義在對(duì)象構(gòu)造函數(shù)或中的函數(shù),其中的都是全局對(duì)象。它僅僅是在另一個(gè)函數(shù)中的一個(gè)函數(shù),顯然符合上文描述的凡是沒有定義在對(duì)象構(gòu)造函數(shù)或中的函數(shù),其中的都是如果想在內(nèi)部函數(shù)訪問(wèn)這個(gè)對(duì)象,也很好解決首選,有的資料上會(huì)用。
不論是面向?qū)ο螅€是基于對(duì)象的語(yǔ)言,都會(huì)有this,我更喜歡叫他this指針,如果你不理解指針,認(rèn)為它是個(gè)引用也無(wú)妨。
這一片文章就是整理一下在各個(gè)情況下的this到底引用的是誰(shuí)。一次來(lái)明白this的用法,下面將是一段段的代碼,每段代碼后面可能有簡(jiǎn)短的說(shuō)明,就是這樣簡(jiǎn)單粗暴。
說(shuō)明一下,這篇文章是基于瀏覽器的,不是原生js,區(qū)別在于瀏覽器全局中的this是Window,而原生js中是global。其次,博主使用的控制臺(tái)輸出,如果你使用document.write方法或alert輸出this,由于這兩個(gè)方法會(huì)調(diào)用對(duì)象的toString方法,你會(huì)得到[object Window]或[object Object]。
注意:本文中對(duì)一般函數(shù)和普通函數(shù)的措辭,這個(gè)只是博主個(gè)人的說(shuō)法,由于上下文(context)的解釋并不是很容易懂,博主自定義了這2個(gè)說(shuō)法,幫助理解。
普通函數(shù)中的thisfunction f(){ console.log(this); //Window }
在js中,凡是沒有定義在對(duì)象、構(gòu)造函數(shù)或prototype中的函數(shù),其中的this都是全局對(duì)象Window。下文把這樣的函數(shù)稱為一般函數(shù)
var a = [1,2,3,4,5]; var b = a.map(function(x){ console.log(this); //Window return x * 2; });
同理上面這個(gè)函數(shù)也沒有定義在對(duì)象、構(gòu)造函數(shù)或者prototype里,所以得到的依然是Window。
注意:Array.prototype.map是定義在數(shù)組原型中的,但是給map傳進(jìn)去的參數(shù)函數(shù)就是一個(gè)一般函數(shù)
function Person(n, a, g){ this.name = n; this.age = a; this.gender = g; console.log(this); } //作為構(gòu)造函數(shù)使用 var o = new Person("Lily", 18, "F"); //this為當(dāng)前對(duì)象 Person {name: "Lily", age: 18, gender: "F"} //作為普通函數(shù)使用 Person("Lily", 18, "F"); //Window
第10行代碼將函數(shù)作為非構(gòu)造函數(shù)使用方式(new方式)調(diào)用,本文把這樣調(diào)用的函數(shù)稱為普通函數(shù)
上面代碼說(shuō)明一下幾點(diǎn):
用new創(chuàng)建對(duì)象的時(shí)候調(diào)用了構(gòu)造函數(shù)。
構(gòu)造函數(shù)和普通函數(shù)的區(qū)別在于調(diào)用方式,而不是定義方式,如果按第10行的方式調(diào)用,他就是個(gè)普通函數(shù),由于普通函數(shù)中的this是于Window,所以上面函數(shù)在第10行調(diào)用后創(chuàng)建了3個(gè)全局變量。
new關(guān)鍵字改變了函數(shù)內(nèi)this的指向,使其指向剛創(chuàng)建的對(duì)象。
function Person(n, a, g){ this.name = n; this.age = a; this.gender = g; this.speak = function (){ //這里只是說(shuō)明this,實(shí)際應(yīng)該在prototype上定義對(duì)象方法 console.log(this); }; } //作為構(gòu)造函數(shù)使用 var o = new Person("Lily", 18, "F"); o.speak(); //Person {name: "Lily", age: 18, gender: "F"} //作為普通函數(shù)使用 Person("Lily", 18, "F"); speak(); //Window
對(duì)象方法中的this同樣指向當(dāng)前對(duì)象
第14行之所以可以調(diào)用speak(),是因?yàn)榈?3行執(zhí)行后在全局創(chuàng)建了speak函數(shù),印證了之前的說(shuō)法。
多說(shuō)一句,為什么11行得到的是$Person{...}$,而不是$Object{...}$。其實(shí)這里顯示的本來(lái)就應(yīng)該是構(gòu)造函數(shù)的名字,如果你通過(guò)$var o = {};$創(chuàng)建的對(duì)象,相當(dāng)于$o = new Object();$,這時(shí)顯示的才是$Object{...}$
function Person(n, a, g){ this.name = n; this.age = a; this.gender = g; } Person.prototype.speak = function (){ //這里只是說(shuō)明this,實(shí)際應(yīng)該在prototype上定義對(duì)象方法 console.log(this); }; //作為構(gòu)造函數(shù)使用 var o = new Person("Lily", 18, "F"); o.speak(); //this為當(dāng)前對(duì)象 Person {name: "Lily", age: 18, gender: "F"} //作為普通函數(shù)使用 Person("Lily", 18, "F"); speak(); //ReferenceError: speak is not defined
由此可見prototype中的方法和構(gòu)造函數(shù)中直接定義方法中this是一樣的。
最后一行出現(xiàn)錯(cuò)誤,這個(gè)不難理解,這里不多說(shuō)了。
如果構(gòu)造函數(shù)有返回值呢?
function Person(n, a){ this.name = n; this.age = a; return { name: "Lucy", }; } var p1 = new Person("Bob", 10); console.log(p1.name); //"Lucy" console.log(p1.age); //undefined
很明顯,這是對(duì)象p1中的this指向返回值對(duì)象
當(dāng)然,構(gòu)造函數(shù)還可以返回函數(shù):
function Fun(x){ console.log(this); return function(){ this.x = x; this.get = function(){ alert(this.x); } } } var o1 = new Fun(2); //Fun {} var o2 = Fun(2); //window console.log(o1 == o2); //false, 這里的o1,o2形式是一樣的,由于構(gòu)成閉包結(jié)構(gòu),所以應(yīng)用不同
但如果構(gòu)造函數(shù)返回了一個(gè)基本類型:
function Fun(n){ this.name = n; return 2; } var o; console.log(o = new Fun("Bob")); // {name: "Bob"}
此時(shí)得到的對(duì)象和返回值無(wú)關(guān)。
到此我們就明白了,構(gòu)造函數(shù)的返回值如果是基本數(shù)據(jù)類型,那返回值和得到的對(duì)象無(wú)關(guān);否則,得到的對(duì)象就是返回值的引用并構(gòu)成閉包。
區(qū)分一下面這個(gè)具體問(wèn)題:
第一個(gè)按鈕得到Window,而第二個(gè)得到input元素!為什么!
再想想,click函數(shù)定義在全局,不在對(duì)象上。而btn.onclick = function(){}中的函數(shù)明顯是在btn對(duì)象上定義的。
說(shuō)閉包前先理解一個(gè)簡(jiǎn)單的:
var o = { name: "Lily", age: 18, gender: "F", speak: function (){ function fun(){ console.log(this); } fun(); } }; o.speak(); //Window
什么,這里是Window了?對(duì)!我們仔細(xì)想想,這個(gè)fun函數(shù)是對(duì)象的方法嗎?顯然不是,它是個(gè)一般函數(shù)。它僅僅是在另一個(gè)函數(shù)中的一個(gè)函數(shù),顯然符合上文描述的:“凡是沒有定義在對(duì)象、構(gòu)造函數(shù)或prototype中的函數(shù),其中的this都是Window”
如果想在內(nèi)部函數(shù)訪問(wèn)這個(gè)對(duì)象,也很好解決:
var o = { name: "Lily", age: 18, gender: "F", speak: function (){ var _this = this; //首選_this,有的資料上會(huì)用self。 function fun(_this){ console.log(_this); } fun(); } }; o.speak(); //Object {name: "Lily", age: 18, gender: "F"}
下面做個(gè)閉包,為了說(shuō)明this的值,這里不定義太多變量,如果對(duì)閉包和作用域有疑惑可以參看博主的另一篇文章:Javascript 函數(shù)、作用域鏈與閉包
var o = { name: "Lily", age: 18, gender: "F", speak: function (){ return function(){ console.log(this); } } }; o.speak()(); //Window
這個(gè)難理解嗎?返回的函數(shù)依然是個(gè)定義在別的函數(shù)里面的一般函數(shù)。如果想讓返回的函數(shù)可以繼續(xù)訪問(wèn)該對(duì)象,依然使用上面的$var _this = this$解決。不過(guò)這里引出了一個(gè)新的問(wèn)題:
var o = { name: "Lily", age: 18, gender: "F", speak: function (){ console.log(this); } }; var fun = o.speak; fun(); //Window
什么?這里還是Window!o.speak明顯是一個(gè)對(duì)象方法啊!那么問(wèn)題來(lái)了?第10行調(diào)用的是誰(shuí)?是fun函數(shù)。那么fun函數(shù)怎么定義的?對(duì),fun的定義決定它是一個(gè)一般函數(shù)。那怎么解決?這個(gè)不用解決,沒人會(huì)試圖在對(duì)象外獲取對(duì)象方法,即便是有需要也應(yīng)該獲取對(duì)象方法內(nèi)的閉包。當(dāng)然,如果你要強(qiáng)行解決它,那就用bind方法吧。
原型中的this什么?原型方法中的this? 看看下面代碼就明白了,這個(gè)理解起來(lái)不會(huì)很難
function F(){ return F.prototype.init(); } F.prototype = { init: function(){ return this; }, test: "test" } var f = F(); console.log(f); //F{test:test}
可見,原型中方法里的this.就是一個(gè)該構(gòu)造函數(shù)的實(shí)例化對(duì)象。jQuery中使用的就是這個(gè)構(gòu)造方法。
bind call和apply方法這3個(gè)方法用來(lái)改變調(diào)用函數(shù)內(nèi)的this值
bind方法將對(duì)象綁定到函數(shù),返回內(nèi)部this值為綁定對(duì)象的函數(shù)。
如果我們不能修改庫(kù)中對(duì)象的方法,我們就不能用$var \_this = this;$的方法改變this值,那么我們換個(gè)角度考慮上面的問(wèn)題:
var o = { name: "Lily", age: 18, gender: "F", speak: function (){ return function(){ console.log(this); } } }; o.speak()(); //Window
最后一行中,o.speak()執(zhí)行完后得到一個(gè)函數(shù),這是個(gè)臨時(shí)函數(shù),定義在全局作用域,如果我們把這個(gè)臨時(shí)函數(shù)綁定到o對(duì)象上,再繼續(xù)調(diào)用這個(gè)函數(shù)不就可以了么:
var o = { name: "Lily", age: 18, gender: "F", speak: function (){ return function(){ console.log(this); } } }; o.speak().bind(o)(); //Object {name: "Lily", age: 18, gender: "F"}
bind不只可以傳入一個(gè)參數(shù),后面的多個(gè)參數(shù)可以作為返回函數(shù)的綁定參數(shù),如下:
function add(a, b){ console.log(a+b); return a+b; } var add2 = add.bind(null, 2); //參數(shù)順序保持一致,第一參為null,不改變this值(但這里會(huì)改變,因?yàn)閍dd2在全局中定義) add2(4); //6
可如果是構(gòu)造函數(shù)呢?記住一點(diǎn),函數(shù)作為構(gòu)造函數(shù)調(diào)用時(shí),bind的第一參數(shù)無(wú)效,注意,僅僅是第一參數(shù)無(wú)效。
function Person(pname, page){ this.name = pname; this.age = page; } var Person2 = Person.bind({name:"hello",city:"Beijing"}, "world"); var p = new Person2(12); console.log(p);//Person{name:"world", age:12}call方法 和 apply方法
這里舉幾個(gè)和上文不一樣的例子
function Animal(){ this.name = "Animal"; } Animal.prototype.showName = function(){ alert(this.name); }; function Cat(){ this.name = "cat"; } var cat = new Cat();
這里Cat沒有showName方法,怎么實(shí)現(xiàn)輸出名字呢?
有c++和java經(jīng)驗(yàn)的人會(huì)認(rèn)為貓屬于動(dòng)物,所以Cat應(yīng)該繼承Animal,所以我們可以這樣修改:
function Animal(){ this.name = "Animal"; } Animal.prototype.showName = function(){ alert(this.name); }; function Cat(){ this.name = "cat"; } Cat.prototype = Animal.prototype; var cat = new Cat(); cat.showName(); //Cat
或者:
function Animal(){ this.name = "Animal"; } Animal.prototype.showName = function(){ alert(this.name); }; function Cat(){ Animal.call(this, "cat"); //繼承 } var cat = new Cat(); cat.showName(); //Cat
有c++和java經(jīng)驗(yàn)就會(huì)知道,在做一個(gè)大型項(xiàng)目之前都是要做UML設(shè)計(jì)的,用例圖、活動(dòng)圖、類圖、狀態(tài)圖等等十幾種圖,對(duì)于沒有一定經(jīng)驗(yàn)的開發(fā)者做這個(gè)簡(jiǎn)直就是噩夢(mèng),而js把各種類或模塊獨(dú)立出來(lái),需要的時(shí)候用call、bind、apply把多個(gè)類聯(lián)系起來(lái),這樣的做法即簡(jiǎn)化了設(shè)計(jì),又簡(jiǎn)化了維護(hù)。
所以js里面很少有上面的寫法,怎么寫看下面:
function Animal(){ this.name = "Animal"; } Animal.prototype.showName = function(){ alert(this.name); } function Cat(){ this.name = "Cat"; } var cat = new Cat(); Animal.prototype.showName.call(cat); //cat Animal.prototype.showName.apply(cat); //cat
對(duì),不過(guò)感覺那里怪怪的,call和apply一樣?他們功能上一樣,只是接受的參數(shù)不同,簡(jiǎn)單寫就是下面這樣:
func.call(func1,var1,var2,var3,...); func.apply(func1,[var1,var2,var3,...]);
它們的第一個(gè)參數(shù)都是指定調(diào)用該函數(shù)的對(duì)象,如果為空就是全局對(duì)象。后面的時(shí)傳入該函數(shù)的參數(shù),區(qū)別在于使用call時(shí)參數(shù)逐一傳入,而使用apply時(shí)參數(shù)構(gòu)成一個(gè)數(shù)組或類數(shù)組對(duì)象傳入。
實(shí)例例子1:
//求下列數(shù)組元素的最大值 var numbers = [5, 6, 9, 3, 7]; var maxValue = Math.max(numbers); alert(maxValue); //NaN maxValue = Math.max.apply(null, numbers); alert(maxValue); //9 //否則你只能這么寫: var max = +Infinity; for (var i = 0, len = numbers.length; i < len; i++) { if (numbers[i] > max) max = numbers[i]; }
例子2
//自定義typeof函數(shù)(注意,系統(tǒng)自帶的typeof是運(yùn)算符,不是函數(shù)) function typeOf(o){ return Object.prototype.toString.call(o).slice(8,-1); } //自定義typeOf函數(shù)測(cè)試 console.log(typeOf (2.1)); //Number console.log(typeOf (undefined)); //Undefined console.log(typeOf ({})); //Object console.log(typeOf ("hello")); //String console.log(typeOf (false)); //Boolean console.log(typeOf (typeOf)); //Function console.log(typeOf (null)); //Null console.log(typeOf ([])); //Array console.log(typeOf (new Date)); //Date console.log(typeOf (/d/)); //RegExp console.log(typeOf (document. getElementsByTagName("body")[0])); //HTMLBodyElement //系統(tǒng)typeof運(yùn)算符測(cè)試 console.log(typeof (2.1)); //number console.log(typeof (undefined)); //Undefined console.log(typeof ({})); //object console.log(typeof ("hello")); //string console.log(typeof (false)); //boolean console.log(typeof (typeOf)); //function console.log(typeof (null)); //object console.log(typeof ([])); //object console.log(typeof (new Date)); //object console.log(typeof (/d/)); //object console.log(typeof (document. getElementsByTagName("body")[0])); //object //明顯比系統(tǒng)自己的實(shí)用多了
例子3
//把類數(shù)組對(duì)象轉(zhuǎn)為數(shù)組(類數(shù)組對(duì)象就是屬性key為0,1,2,...,還具有一個(gè)key為length的可以像數(shù)組一樣動(dòng)態(tài)改變的值的對(duì)象) function(){ return Array.prototype.slice.call(arguments); }
例子4
//用js訪問(wèn)元素偽類 function getRuleSelector(selector){ return Array.prototype.filter.call(getCssList(), function(x){ return pure(x.selectorText) === pure(selector); }); function pure(selector){ selector.replace(/::/g, ":"); //把雙冒號(hào)替換為單冒號(hào) } function getCssList(){ return Array.prototype.concat.apply([], Array.prototype.map.call(document.styleSheets, function(x){ return Array.prototype.slice.call(x.cssRules); })); } }
例子5
//為每個(gè)DOM元素注冊(cè)事件 Array.prototype.forEach.call(document.querySelectAll("input[type=button]"), function(ele){ ele.addEventLister("click", fun, false); });
例子6
//自定義forEach函數(shù)遍歷Dom元素列表(類數(shù)組對(duì)象) var forEach = Function.prototype.call.bind(Array.prototype.forEach); DOMElementList = document.getElementByTagName("li"); forEach(DOMElementList, function (el) { el.addEventListener("click", handle); //handle定義省略 });箭頭函數(shù)中的this
之所以最后說(shuō)箭頭函數(shù),一方面因?yàn)檫@是ES6中的內(nèi)容,更重要的時(shí)因?yàn)榧^函數(shù)中的this永遠(yuǎn)不能被call, bind和apply改變,也就是說(shuō)箭頭函數(shù)中的this可不改變,僅僅與其定義的位置有關(guān)。
箭頭函數(shù)的最大特點(diǎn)是:它不改變this的作用域(上下文環(huán)境),但是依然構(gòu)成局部作用域,我們之前遇到過(guò)閉包內(nèi)this值被改變的問(wèn)題,我們用重新定義局部變量的方式解決了這個(gè)問(wèn)題。如果有了箭頭函數(shù),解決這個(gè)問(wèn)題就簡(jiǎn)單多了
這是上面出現(xiàn)過(guò)的一段代碼:
var o = { name: "Lily", age: 18, gender: "F", speak: function (){ function fun(){ console.log(this); } fun(); } }; o.speak(); //window
看看用箭頭函數(shù)函數(shù)怎優(yōu)雅的解決這個(gè)問(wèn)題
var o = { name: "Lily", age: 18, gender: "F", speak: function (){ (() => {console.log(this);})(); //一個(gè)立即執(zhí)行的箭頭函數(shù) } }; o.speak(); //Object {name: "Lily", age: 18, gender: "F"}
或者這樣也可以:
var o = { name: "Lily", age: 18, gender: "F", speak: function (){ return () => {console.log(this);}; //返回一個(gè)箭頭函數(shù) } }; o.speak()(); //Object {name: "Lily", age: 18, gender: "F"}with
with 可以改變上下文環(huán)境,實(shí)際開發(fā)中十分不建議使用 with, 但關(guān)于 with 這里簡(jiǎn)單說(shuō)明一下,看一個(gè)示例:
var a, x, y; var r = 10; with (Math) { a = round(PI * r * r); x = r * cos(PI); y = r * sin(PI / 2); } console.log(a, x, y); //314 -10 10
但是如果在 with 內(nèi)直接聲明變量會(huì)發(fā)生什么:
var obj = { name: "test" }; with(obj){ //內(nèi)部定義的變量都注冊(cè)在 obj 上 name = "hello"; var salary = 10000; age = 20; } console.log(obj.name); //"hello" console.log(obj.age); //undefined console.log(age); //20, 如果對(duì)象不具有這個(gè)屬性,該定義會(huì)意外的出現(xiàn)在 全局變量中 console.log(obj.salary); //undefined console.log(salary); //10000, 如果對(duì)象不具有這個(gè)屬性,該定義會(huì)意外的出現(xiàn)在 全局變量中
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97462.html
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸耍虼宋闹兄豢炊?8 成左右,希望能夠給大家?guī)?lái)幫助....(據(jù)說(shuō)是阿里的前端妹子寫的) this 的值到底...
摘要:作為構(gòu)造函數(shù)調(diào)用中沒有類,但是可以從構(gòu)造器中創(chuàng)建對(duì)象,并提供了運(yùn)算符來(lái)進(jìn)行調(diào)用該構(gòu)造器。構(gòu)造器的外表跟普通函數(shù)一樣,大部分的函數(shù)都可以當(dāng)做構(gòu)造器使用。如果構(gòu)造函數(shù)顯式的返回一個(gè)對(duì)象,那么則會(huì)指向該對(duì)象。 this 的指向 this 是 js 中定義的關(guān)鍵字,它自動(dòng)定義于每一個(gè)函數(shù)域內(nèi),但是它的指向卻讓人很迷惑。在實(shí)際應(yīng)用中,this 的指向大致可以分為以下四種情況。 1.作為普通函數(shù)調(diào)...
摘要:再來(lái)看一個(gè)小的示例淘寶騰訊淘寶為什么輸出的依然是淘寶呢調(diào)用的是對(duì)象中的方法,方法里面有一個(gè)定時(shí)器,而定時(shí)器的一個(gè)參數(shù)是這里的指的就是的對(duì)象,然后方法里面有調(diào)用了,但是定時(shí)器中的指的是對(duì)象,所以最終調(diào)用的是對(duì)象中。 1.看前熱身 看一段代碼 var name = javascript; var obj = { name:js, foo:f...
摘要:但是有一個(gè)總的原則,那就是指的是,調(diào)用函數(shù)的那個(gè)對(duì)象使用主要分四種情況,討論下指針的用法和注意事項(xiàng)一純粹的函數(shù)調(diào)用這是函數(shù)的最通常用法,屬于全局性調(diào)用,因此就代表全局對(duì)象。 this是Javascript語(yǔ)言的一個(gè)關(guān)鍵字它代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用,隨著函數(shù)使用場(chǎng)合的不同,this的值會(huì)發(fā)生變化。但是有一個(gè)總的原則,那就是this指的是,調(diào)用函數(shù)的那個(gè)對(duì)...
摘要:但是有一個(gè)總的原則,那就是指的是,調(diào)用函數(shù)的那個(gè)對(duì)象使用主要分四種情況,討論下指針的用法和注意事項(xiàng)一純粹的函數(shù)調(diào)用這是函數(shù)的最通常用法,屬于全局性調(diào)用,因此就代表全局對(duì)象。 this是Javascript語(yǔ)言的一個(gè)關(guān)鍵字它代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用,隨著函數(shù)使用場(chǎng)合的不同,this的值會(huì)發(fā)生變化。但是有一個(gè)總的原則,那就是this指的是,調(diào)用函數(shù)的那個(gè)對(duì)...
摘要:當(dāng)然這還沒完,因?yàn)槲覀冞€有重要的一步?jīng)]完成,沒錯(cuò)就是上面的第行代碼,如果沒有這行代碼實(shí)例中的指針是指向構(gòu)造函數(shù)的,這樣顯然是不對(duì)的,因?yàn)檎G闆r下應(yīng)該指向它的構(gòu)造函數(shù),因此我們需要手動(dòng)更改使重新指向?qū)ο蟆? 第一節(jié)內(nèi)容:javaScript原型及原型鏈詳解(二) 第一節(jié)中我們介紹了javascript中的原型和原型鏈,這一節(jié)我們來(lái)講利用原型和原型鏈我們可以做些什么。 普通對(duì)象的繼承 ...
閱讀 1266·2021-10-14 09:50
閱讀 1567·2019-08-30 15:54
閱讀 1023·2019-08-30 11:22
閱讀 2916·2019-08-30 10:50
閱讀 1801·2019-08-29 18:39
閱讀 3050·2019-08-29 13:07
閱讀 2079·2019-08-28 17:54
閱讀 751·2019-08-26 17:44