1. 程式人生 > >【步兵 cocos-js】逆向思維 對 js物件和函式進行分析

【步兵 cocos-js】逆向思維 對 js物件和函式進行分析

逆向思維 對 js物件和函式進行分析 by EOS.

一、關於 this

首先理解一下this,我的個人理解,

man.work = function(){
this;
}
man.work()

work是個函式,那麼這個函式體內的this,就是呼叫他的物件,
a.work this就是a,b.work this就是b,誰點this就是誰。
(這裡的“是”,只的是指向指向的同一地址)

二、obeject 和 function

有了這個基礎,那麼下面我們來分析啊,函式 和 物件。

var Person = function(){}; //Person 是一個 function
var man = new Person(); // man 是一個 obejct //上面可以理解為這樣。 var man = {}//或 new Obeject(); man.xxx = Person; man.xxx();

所以Person裡面的this就會指向man,因為是man點的。

現在我給Person新增一個方法,因為Person他是也一個物件。
(這裡請務必我吐槽下,func可以巢狀func,那就意味著函式可以我們可以這樣:
Person.say.h.e.l.l.o.b.a.b.y.l.e.t.s.go() 你沒有看錯,我只是在呼叫一個函式。233333)

咳咳,不要被我拐跑了,趕緊回神!回神!

Person.say = function () {
    log(this.name);
}

那麼我們如果用man.say()這樣去呼叫,他是找不到say這個方法的。

根據之前上面說的,我們可以知道這個this是指向Person的。
但是上面有這麼一句:

man.xxx = Person;

那麼是不是我知道這個xxx,我就可以去掉用say呢?
答案是肯定的。而這個xxx就是constructor。

所以用man.constructor.say() 就可以輸出Person.name。

到這裡你有沒有對 物件和函式 理解更加深刻了一些呢~
(ps:沒有?我tm寫了這麼多,你竟然說沒有?!)

三、prototype

咳咳,趁熱打鐵不妨讓我們在昇華一下?

其實呢, var man = new Person();
還不止做了這麼多。他還做了另外一件事那就是

man.\__proto__ = Person.prototype;

好了,你說我寫了個say,就是想給man用的啊,他調不到怎麼辦,
那麼有這裡3個方法:

(函式主體用xxxx來代替)
1. 蠢蠢的方法:man.say = xxxx ; (ps:你TM在逗我?)
2. 明智的方法:寫到Person裡面,Person = function(){this.say = xxxx;}
3. 叼叼的方法:(要來了要來了,我會告訴你前面都是為了這裡做鋪墊?)
Person.prototype.say= xxxx;

在第3個方法的情況下,我們呼叫man.say(),他會怎麼做呢,當然是去Person裡面翻廚搗櫃,
翻了半天發現沒有,怎麼辦呢,他就會去自己的__proto__裡找,那麼他的__proto__是什麼呢?
當然就是Person.prototype啊,我們say就是賦給他的啊!!!!
(ps:這個功能簡直就好比,哆啦A夢的口袋啊,我缺什麼你來什麼,幸福來的太突然有沒有~~)

三、題外話

上文中涉及到了一些關鍵字

  1. constructor
  2. __proto__
  3. prototype

這裡就不對他們做過多介紹了,網上有很多理論性的東西供給大家看,複製過來也沒什麼意義,
而且一個檔案不能過長,這是我的程式設計習慣~23333,絕對沒有偷懶。

關於prototype在開發中的妙用,我在下面文章中介紹給大家~
為什麼不繼續寫呢?因為寫到這裡已經很長了~這裡寫圖片描述

See Again~
之前
真愛無價,歡迎打賞~
讚賞碼