JSLearning

JSLearning

標(biāo)簽(空格分隔): 前端學(xué)習(xí)


基礎(chǔ)

值類型

  • Undefine
  • Null
  • Boolean
  • Number
  • String

引用類型

  • Object

Object支持動態(tài)創(chuàng)建屬性

var person = new Object(); 
person.name = "Hello JavaScript"; 
alert(person .name);

檢測類型

var s = "Nicholas" ;
alert(typeof s); //string
person = new Object ();
alert(person instanceof Object );//true

RegExp

var expression1 = /[bc]at/i
var expression2 = new ReqExp("[bc]at","i");

正則表達(dá)式字符串匹配元字符以及已經(jīng)轉(zhuǎn)義過的字符需要雙重轉(zhuǎn)義

元字符:( [ { \ ^ $ | ) ? * + . ] }需要轉(zhuǎn)義成"\\["
已轉(zhuǎn)義的字符:\n \ 需要轉(zhuǎn)義成"\\n" "\\\\"

Function

函數(shù)本質(zhì)上一個對象,是Function類型的實例。

//函數(shù)聲明
function sum (num1,num2) {
    return num1 + num2;
}
//函數(shù)表達(dá)式
var sum = function(num1, num2) {
    return num1 + num2; 
}
var sum = new Function("num1","num2","return num1 + num2");//不推薦
//這三種都是定義一個函數(shù)削彬,但是sum可以改變的啼县,僅僅是一個指針

沒有重載的概念

函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別

解析器在加載數(shù)據(jù)的時候囊卜,會率先讀取函數(shù)聲明端仰,并使其在執(zhí)行任何代碼之前可用沛鸵;治愈函數(shù)表達(dá)式噪矛,則必須等解析器執(zhí)行到它所在的代碼行医清,才會被真正正確的解釋執(zhí)行起暮。
alert(sum(10,10));
function sum (num1,num2) {
    return num1 + num2;
}
//以上代碼ok
alert(sum(10,10));
var sum = function(num1, num2) {
    return num1 + num2; 
}
//以上代碼error

函數(shù)可以當(dāng)參數(shù),也可以當(dāng)返回值

函數(shù)的內(nèi)部屬性

*arguments(傳入函數(shù)的所有參數(shù))
*arguments.callee(正在被執(zhí)行的函數(shù)對象)
*arguments.callee.caller(當(dāng)前函數(shù)的調(diào)用方)
*this(執(zhí)行的環(huán)境對象会烙,網(wǎng)頁的全局域中調(diào)用的時候,this就是window,如果作為一個對象的屬性調(diào)用负懦,比如o.sum(10,10),this就是o這個對象)

函數(shù)屬性和方法

*length 參數(shù)的數(shù)量
*prototype
*call,apply 設(shè)定函數(shù)的作用域,即this的值
*bind 綁定函數(shù)的作用域柏腻,即this的值

基本的包裝類型

特殊的引用類型
*Boolean
*Number
*String


面向?qū)ο蠡A(chǔ)

對象是無序?qū)傩缘募现嚼鳎鋵傩钥梢园局怠ο蠡蛘吆瘮?shù)五嫂。

//對象定義
var person = {
    name:"Nicholas",
    age:29,
    job:"Software Engineer",
    sayName:function(){
        alert(this.name);
    }
}

數(shù)據(jù)屬性

  1. Configurable:是否可以通過delete刪除屬性
  2. Enumerable:是否可以通過for-in循環(huán)返回屬性
  3. Writable:是否可寫
  4. Value:屬性的數(shù)據(jù)值

對象直接定義和通過defineProperty定義屬性的時候以上的各個值默認(rèn)值不一樣颗品,前者都是true,后者都是false,但value都是undefine。

訪問器屬性

  1. Configurable
  2. Enumerable
  3. Get 讀取屬性時調(diào)用的函數(shù)
  4. Set 寫入時調(diào)用的函數(shù)

對象直接定義和通過defineProperty定義屬性的時候以上的各個值默認(rèn)值不一樣沃缘,前者都是true,后者都是false,但get & set 都是undefine躯枢。

var book = {
    _year:2004,
    edition:1
}
Object.defineProperty(book,"year",{
    get:function(){
        return this._year
    }
    set:function(newValue) {
        
        if (newValue > 2004) {
            
            this.year = newValue;
            this.edition = newValue - 2004; 
        }
    }
});

book.year = 2005;
alert(bool.edition)

讀取屬性的特性

Object.getOwnPropertyDescriptor


創(chuàng)建對象

工廠模式

function createPerson(name,age,job) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function() {
        alert(this.name);
    }
    return o;
}

構(gòu)造函數(shù)模式

function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        alert(this.name);
    }
}
var person1 = new Person("Greg",27,"Doctor");
//person1會有一個construtor(構(gòu)造函數(shù))屬性 指向Person

使用new加構(gòu)造函數(shù)創(chuàng)建實例會經(jīng)歷以下4個步驟

  1. 創(chuàng)建一個新的對象
  2. 將構(gòu)造函數(shù)的作用域賦給對象(因此this指向了這個新對象)
  3. 執(zhí)行構(gòu)造函數(shù)中的代碼(為這個對象添加屬性)
  4. 返回新的對象

對象類型檢測

alert(person1 instanceof Person);//true;
alert(person1 instanceof Object);//true

構(gòu)造函數(shù)的問題

屬性時函數(shù)對象的對象,會重復(fù)創(chuàng)建槐臀。


原型模式

每個函數(shù)都有一個prototype屬性锄蹂,是一個指針,指向一個對象水慨,作用是讓實例共享屬性和方法得糜。

原型對象的理解

function Person() {
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function() {
    alert(this.name);
}

var person1 = new Person();
person1.sayName();//訪問原型對象的
  • Person(函數(shù)對象)
  • Peron.prototype(原型對象)
  • person1(實例)

函數(shù)對象通過prototype屬性訪問原型對象,原型對象可以通過constructor對象訪問函數(shù)對象晰洒,實例對象可以通過[[Prototype]]訪問原型對象朝抖。
每當(dāng)讀取實例的某個屬性的時候,都會執(zhí)行一個搜索谍珊,首先搜索實例本身治宣,然后沿著原型鏈搜索。

原型鏈:通過[Prototype]]屬性連接起來砌滞,末端是Object.prototype

調(diào)用實例函數(shù)的時候炼七,即使這個函數(shù)是原型對象定義,函數(shù)中的this依然指向當(dāng)前實例
對象中新增一個和原型對象重名屬性時,不會重寫原型的值布持,而是新增一個屬性豌拙,并屏蔽原型對象的屬性
hasOwnProperty()判斷某個屬性是否是實例屬性。
!object.hasOwnProperty(name) && (name in object)判斷name是object原型對象的方法

原型的動態(tài)性

實例創(chuàng)建后修改原型题暖,也能從實例中反映出來按傅。


組合使用構(gòu)造函數(shù)模式和原型模式

最常用的創(chuàng)建對象的方式

function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.jog = job;
    this.friends = ["shelby","court"];
}
Person.prototype.sayName = function() {
    alert(this.name);
}
var person1 = new Person("Nicholas",29,"Doctor");
//實例屬性在構(gòu)造函數(shù)中定義捉超,所有實例共享原型對象的屬性,這個是默認(rèn)模式

動態(tài)原型模式

function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.jog = job;
    if (typeof this.sayName != "function") {
        Person.prototype.sayName = function() {
            alert(this.name);
        }
    }
}

繼承

原型鏈繼承

function SuperType() {
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    return this.property;
}

function SubType() {
    this.subProperty = false;
}

//繼承了SuperType
SubType.prototype = new SuperType();
//修復(fù)constructor
SubType.prototype.constructor = SubType;
SubType.prototype.getSubVale = function() {
    return this.subproperty;
}
var instance = new SubType();
alert(instance.getSuperValue());//true

以上代碼最終形成這樣的關(guān)系

SubType實例 -> SuperType實例(SubType.prototype) -> SuperType.prototype(Object實例) -> Object.prototype
SubType繼承SuperType,SuperTyper繼承Object

所有類型默認(rèn)都繼承Object類型唯绍,原因是默認(rèn)原型都是Object的實例拼岳,指向了Object.prototype。

確定原型和實例的關(guān)系

alert(instance instanceof Object);//true
alert(instance instanceof SuperType);//true
alert(instance instanceof SubType);//true

給原型添加新方法况芒,一定要放在替換原型語句之后

單純的原型鏈問題:父類如果定義屬性惜纸,被子類繼承的時候,會被各個子類的實例共享绝骚,創(chuàng)建子類類型的時候耐版,不能像父類傳遞屬性。

構(gòu)造函數(shù)繼承

function SupetType(name) {
    this.name = name;
}

function SubType() {
    //繼承了SuperType,同時還傳遞了參數(shù)
    SuperType.call(this,"Nicholas");
    
    //實例屬性
    this.age = 29;
}
var instance = new SubType();
alert(instance.name);//Nicholas;
alert(instance.age);//29

借用構(gòu)造函數(shù)的問題:函數(shù)屬性在構(gòu)造函數(shù)內(nèi)部定義压汪,無復(fù)用粪牲,超類型原型中定義的方法,對子類不可見止剖。

組合模式

最常用的繼承方式

function SuperType(name) {
    this.name = name;
    this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function() {
    alert(this.name);
};

function SubType(name,age) {
    //繼承屬性
    SuperType.call(this,name);
    //子類屬性
    this.age = age;
}

//繼承方法
SubType.prototype = new SuperType();
//修正constructor
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function() {
    alert(this.age);
};

var instance1 = new SubType("Nicholas",29);
instance1.colors.push("black");
alert(instance1.colors);//"red,blue,green,black"
instance1.sayName();///Nicholas
instance1.sayAge();//29

var instance2 = new SubType("Greg",27);
alert(instance2.colors);//"red,bule,green"
instance2.sayName();//Greg
instance2.sayAge();//27

淺復(fù)制

var person = {
    name:"Nicholas",
    friends:["Shelby","Court","Van"]
}

var anotherPerson = Object.create(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");

var yetAnotherPerson = Object.create(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");

alert(person.friends);//"Shelby,Court,Van,Rob,Barbie"
//覆蓋同名屬性
var haAnotherPerson = Object.create(person,{
    name:{
        value:"Greg"
    }});
alert(anotherPerson.name);//Greg

//這個函數(shù)的作用和Object.create傳入一個參數(shù)時行為相同
function object(o) {
    function F(){}
    F.prototype = o;
    return new F();
}

寄生組合式繼承

最理想的繼承范式

function SuperType(name) {
    this.name = name;
    this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function() {
    alert(this.name);
};

function SubType(name,age) {
    //繼承屬性
    SuperType.call(this,name);
    //子類屬性
    this.age = age;
}

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

function inheritPrototype(subType,superType) {
    var prototype = object(superType.prototype);
    prototype.constructor = subType;
    subType.prototype = prototype;
}

inheritPrototype(SubType,SuperType);
SubType.prototype.sayAge = function() {
    alert(this.age);
};

var instance1 = new SubType("Nicholas",29);
instance1.colors.push("black");
alert(instance1.colors);//"red,blue,green,black"
instance1.sayName();///Nicholas
instance1.sayAge();//29

var instance2 = new SubType("Greg",27);
alert(instance2.colors);//"red,bule,green"
instance2.sayName();//Greg
instance2.sayAge();//27

函數(shù)表達(dá)式

//函數(shù)聲明提升腺阳,調(diào)用可以放在聲明前
sayHi();
function sayHi() {
    alert("Hi!");
}

//函數(shù)表達(dá)式,錯誤穿香,函數(shù)還不存在
sayHi();
var sayHi = function() {
    alert("Hi!");
}

遞歸

function factorial(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * arguments.callee(num-1);
    }
}

//命名函數(shù)表達(dá)式
var factorial = (function f(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * f(num-1);
    }
})

閉包

類似于block,定義的時候可以引用外部變量亭引,并持有。

function crateComparisonFunction(propertyName) {
    
    return function(object1,object2) {
        //引用了propertyName
        var value1 = object1[propertyName];
        var value2 = object2[propertyName];
        
        if (value1 < value2) {
            return -1;
        } else if (value1 > value2) {
            return 1;
        } else {u
            retrn 0;
        }
    };
}

閉包和變量

function createFunctions() {
    var result = new Array();
    
    for (var i = 0;i < 10; i++) {
        result[i] = function() {
            return i;
        }
    }
    
    //result數(shù)組中 每個函數(shù)變量i都是10 不是copy 只是引用
    return result;
}

function createFunctions() {
    
    var result = new Array();
    
    for (var i = 0;i < 10;i++) {
        result[i] = function(num){
            return function() {
                return num;
            }
        }(i);
    }
    
    //result數(shù)組中 每個函數(shù)的變量num就是從0到9
    return result;
}

關(guān)于this

var name = "The Window";

var object = {
    name:"My Object".
    getNameFunc:function() {
        return function() {
            return this.name;
        }
    }
}
alert(object.getNameFunc()());//"The Window";
//這個調(diào)用和以上相同 所以this=window.
var f = object.getNameFunc();
alert(f();)
var name = "The Window";

var object = {
    name:"My Object".
    getNameFunc:function() {
        var that = this;
        return function() {
            return that.name;
        }
    }
}
alert(object.getNameFunc()());//"My Object";

內(nèi)存泄露

function assignHandler() {
    var element = document.getElementById("someElement");
    //循環(huán)引用 
    element.onclick = function() {
        alert(element.id);
    }
}

//破除循環(huán)引用
function assignHandler() {
    var element = document.getElementById("someElement");
    var id = element.id;
    //循環(huán)引用 
    element.onclick = function() {
        alert(id);
    }
    //局部變量設(shè)置為null,閉包也不會引用element皮获,就不會循環(huán)引用了焙蚓。
    element = null;
}

閉包會引用包含函數(shù)的局部變量,即使沒有直接引用局部變量魔市,進(jìn)而閉包會持有局部變量指向的對象,要破除這種持有赵哲,可以將局部變量設(shè)置為null在包含函數(shù)結(jié)束前待德。

模仿塊級作用域

(function() {
    //這里是塊級作用域
})();

私有變量

funciton MyOject() {
    //私有變量和私有函數(shù)
    var privateVariable = 10;
    
    function privateFunction() {
        return false;
    }
    
    //特權(quán)方法
    this.publicMethod = function() {
        privateVariable++;
        return privateFunction();
    }
}
var object = new MyObject();
alert(object.publicMethod);

靜態(tài)私有變量

(function() {
    
    //私有變量和私有函數(shù)
    var privateVariable = 10;
    
    function privateFunction() {
        return false;
    }
    
    //構(gòu)造函數(shù) 未經(jīng)聲明的變量,會創(chuàng)建一個全局變量枫夺。
    MyObject = function() {
    
    };
    //公有/特權(quán)方法
    MyOject.prototype.publicMethod = function() {
        privateVariable++;
        return privateFunction();
    };
})

模塊模式

var singleton = function() {
    //私有變量和函數(shù)
    var privateVariable = 10;
    
    function privateFunction() {
        return false;
    }
    
    //公有方法和屬性
    return {
        publicProperty:true,
        publicMethod:function() {
            privateVariable++;
            return privateFunction();
        }
    }
}();

增強的模塊模式

var singleton = function() {
    //私有變量和函數(shù)
    var privateVariable = 10;
    
    function privateFunction() {
        return false;
    }
    //創(chuàng)建對象
    var object = new CustomType();
    
    //添加公有方法和屬性
    object.publicProperty = true;
    object.publicMethod = function() {
            privateVariable++;
            return privateFunction();
    };

    return object;
}();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末将宪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子橡庞,更是在濱河造成了極大的恐慌较坛,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒最,死亡現(xiàn)場離奇詭異丑勤,居然都是意外死亡,警方通過查閱死者的電腦和手機吧趣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門法竞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耙厚,“玉大人,你說我怎么就攤上這事岔霸⊙” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵呆细,是天一觀的道長型宝。 經(jīng)常有香客問我,道長絮爷,這世上最難降的妖魔是什么趴酣? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮略水,結(jié)果婚禮上价卤,老公的妹妹穿的比我還像新娘。我一直安慰自己渊涝,他們只是感情好慎璧,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跨释,像睡著了一般胸私。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鳖谈,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天岁疼,我揣著相機與錄音,去河邊找鬼缆娃。 笑死捷绒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贯要。 我是一名探鬼主播暖侨,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崇渗!你這毒婦竟也來了字逗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宅广,失蹤者是張志新(化名)和其女友劉穎葫掉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跟狱,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡俭厚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驶臊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片套腹。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡绪抛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出电禀,到底是詐尸還是另有隱情幢码,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布尖飞,位于F島的核電站症副,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏政基。R本人自食惡果不足惜贞铣,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沮明。 院中可真熱鬧辕坝,春花似錦、人聲如沸荐健。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽江场。三九已至纺酸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間址否,已是汗流浹背餐蔬。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留佑附,地道東北人樊诺。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像音同,于是被迫代替她去往敵國和親词爬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

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

  • 本章內(nèi)容 理解對象屬性 理解并創(chuàng)建對象 理解繼承 面向?qū)ο笳Z言有一個標(biāo)志瘟斜,那就是它們都有類的概念缸夹,而通過類可以創(chuàng)建...
    悶油瓶小張閱讀 853評論 0 1
  • 博客內(nèi)容:什么是面向?qū)ο鬄槭裁匆嫦驅(qū)ο竺嫦驅(qū)ο缶幊痰奶匦院驮瓌t理解對象屬性創(chuàng)建對象繼承 什么是面向?qū)ο?面向?qū)ο?..
    _Dot912閱讀 1,428評論 3 12
  • 小小的手 肉肉的小手 柔軟的小肉手 當(dāng)你的手伸向我 當(dāng)你握住我的手 我的心啊 軟軟 暖暖 柔柔 像你那小小肉肉的手
    萍梗子閱讀 229評論 2 3
  • 不是沒有朋友痪寻,身邊的朋友很多螺句,三五成群,想聚聚橡类,一個電話而已蛇尚;不是不喜歡熱鬧,很多人聚在一起多歡樂顾画,歡樂的時光暫且...
    賴上清風(fēng)閱讀 258評論 0 0
  • 有些人自己不愿意學(xué)習(xí)外語取劫,兩個還說是愛國匆笤,其實沒有學(xué)習(xí)外語的人根本就不是愛國。這只是為你的無能找借口谱邪,...
    阡陌望你閱讀 515評論 2 3