原文大意是作者面試一個(gè)妹子养葵,發(fā)現(xiàn)妹子雖然有四五年JS經(jīng)驗(yàn),實(shí)際卻對(duì)JS知之甚少邦尊。作者思前想后背桐,最終點(diǎn)燈熬油(腦補(bǔ)),有了這篇經(jīng)驗(yàn)之談蝉揍。
原文:Create Advanced Web Applications With Object-Oriented Techniques
中文:使用面向?qū)ο蟮募夹g(shù)創(chuàng)建高級(jí)Web應(yīng)用程序
JavaScript對(duì)象就是詞典
在 C++ 或 C# 中链峭,在談?wù)搶?duì)象時(shí),是指類或結(jié)構(gòu)的實(shí)例又沾。對(duì)象有不同的屬性和方法熏版,具體取決于將它們實(shí)例化的模板(即類)。而 JavaScript 對(duì)象卻不是這樣捍掺。在 JavaScript 中撼短,對(duì)象只是一組名稱/值對(duì),就是說(shuō)挺勿,將 JavaScript 對(duì)象視為包含字符串關(guān)鍵字的詞典曲横。
JavaScript 對(duì)象/詞典只接受字符串關(guān)鍵字,而不是像 Python 詞典那樣接受可哈喜黄浚化的對(duì)象禾嫉。
JavaScript函數(shù)一流
在很多編程語(yǔ)言中,函數(shù)和對(duì)象通常被視為兩樣不同的東西蚊丐。在 JavaScript 中熙参,其差別很模糊 — JavaScript 函數(shù)實(shí)際上是具有與它關(guān)聯(lián)的可執(zhí)行代碼的對(duì)象。
- 向?qū)ο筇砑臃椒▽⑹呛苋菀椎氖虑椋褐恍柽x擇名稱麦备,然后將函數(shù)賦給該名稱孽椰。因此,我通過(guò)將匿名函數(shù)分別賦給相應(yīng)的方法名稱凛篙,在對(duì)象中定義了三個(gè)方法:
- JavaScript 中的函數(shù)是對(duì)象黍匾。每個(gè)函數(shù)對(duì)象都有一個(gè)名為 call 的方法,它將函數(shù)作為第一個(gè)參數(shù)的方法進(jìn)行調(diào)用呛梆。就是說(shuō)锐涯,作為函數(shù)第一個(gè)參數(shù)傳遞給 call 的任何對(duì)象都將在函數(shù)調(diào)用中成為“this”的值。
- 絕不要調(diào)用包含“this”(卻沒(méi)有所屬對(duì)象)的函數(shù)填物。否則纹腌,將違反全局命名空間霎终,因?yàn)樵谠撜{(diào)用中,“this”將引用全局對(duì)象升薯,而這必然會(huì)給您的應(yīng)用程序帶來(lái)災(zāi)難莱褒。例如,下面的腳本將更改 JavaScript 的全局函數(shù) isNaN 的行為覆劈。一定不要這樣做!
示例
alert(“NaN is NaN: “ + isNaN(NaN));
function x() {
this.isNaN = function() {
return “not anymore!”;
};
}
// alert!!! trampling the Global object!!!
x();
alert(“NaN is NaN: “ + isNaN(NaN));
構(gòu)造函數(shù)不是類
Javascript沒(méi)有類沛励,函數(shù)在與 "new" 運(yùn)算符一起使用時(shí)责语,函數(shù)將充當(dāng)構(gòu)造函數(shù)∧颗桑“new” 運(yùn)算符執(zhí)行的操作很簡(jiǎn)單坤候。首先,它創(chuàng)建一個(gè)新的空對(duì)象企蹭。然后執(zhí)行緊隨其后的函數(shù)調(diào)用白筹,將新的空對(duì)象設(shè)置為該函數(shù)中“this”的值。
var spot = new DogConstructor(“Spot”);
等同于:
var spot = {};
DogConstructor.call(spot, “Spot”);
原型
在 JavaScript 中谅摄,每個(gè)函數(shù)都有名為“prototype”的屬性徒河,用于引用原型對(duì)象。此原型對(duì)象又有名為“constructor”的屬性送漠,它反過(guò)來(lái)引用函數(shù)本身顽照。這是一種循環(huán)引用
靜態(tài)屬性和方法
閉包
模擬私有屬性
從類繼承
模擬命名空間
JavaScript沒(méi)有任何特定語(yǔ)言功能來(lái)支持命名空間,但很容易使用對(duì)象來(lái)模擬命名空間闽寡。如果要?jiǎng)?chuàng)建一個(gè) JavaScript 庫(kù)代兵,則可以將它們包裝在命名空間內(nèi),而不需要定義全局函數(shù)和類爷狈。