摘要:在構(gòu)造函數(shù)內(nèi)部,將屬性設(shè)置成等于全局的函數(shù)。調(diào)用構(gòu)造函數(shù)的一個(gè)實(shí)例后,該實(shí)例內(nèi)部將包含一個(gè)指針中稱(chēng)為,指向構(gòu)造函數(shù)的原型對(duì)象。原型對(duì)象的問(wèn)題省略了為構(gòu)造函數(shù)傳遞初始化參數(shù)這一環(huán)節(jié),結(jié)果所有實(shí)例在默認(rèn)情況下都取得相同的屬性值。
創(chuàng)建對(duì)象
使用對(duì)象字面量的形式一個(gè)接口會(huì)創(chuàng)建很多對(duì)象, 會(huì)產(chǎn)生大量的重復(fù)代碼。
工廠模式:用函數(shù)來(lái)封裝以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)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; } var person1 = createPerson("Simon", 29, "software Engineer"); var person2 = createPerson("Zaynex",22, "Doctor");
這種模式解決了創(chuàng)建多個(gè)相似對(duì)象的問(wèn)題,但卻沒(méi)有解決對(duì)象識(shí)別的問(wèn)題(即怎樣知道一個(gè)對(duì)象的類(lèi)型)
構(gòu)造函數(shù)模式- 可用于創(chuàng)建特定模式的對(duì)象,像Object、Array等原生構(gòu)造函數(shù),在運(yùn)行時(shí)會(huì)自動(dòng)出現(xiàn)在執(zhí)行環(huán)境中。
我們利用構(gòu)造函數(shù)重寫(xiě)下剛才的函數(shù)。
function createPerson(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function() { alert(this.name); }; } var person1 = new Person("Simon",29, "software Engineer"); var person2 = new Person("Simon",29, "software Engineer");構(gòu)造函數(shù)與工廠模式的差異
沒(méi)有顯示地創(chuàng)建對(duì)象;
直接將屬性和方法賦給this對(duì)象;
沒(méi)有 return 語(yǔ)句;
我們注意到Person開(kāi)頭是大寫(xiě),按照慣例來(lái)講,構(gòu)造函數(shù)開(kāi)頭字母是大寫(xiě),非構(gòu)造函數(shù)以小寫(xiě)字母開(kāi)頭。
調(diào)用構(gòu)造函數(shù)四步驟創(chuàng)建一個(gè)新對(duì)象;
將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此this就指向了這個(gè)新對(duì)象);
執(zhí)行構(gòu)造函數(shù)中的代碼(為構(gòu)造函數(shù)新對(duì)象添加屬性)
返回新對(duì)象
person1和person2都保存著Person的一個(gè)不同的實(shí)例。這兩個(gè)對(duì)象都有一個(gè)constructor(構(gòu)造函數(shù))屬性,該屬性指向Person。
alert(person1.constructor == Person) //true; alert(person2.constructor == Person) //true;
對(duì)象的constructor屬性最初是用來(lái)標(biāo)識(shí)對(duì)象類(lèi)型的。但是提到檢測(cè)對(duì)象類(lèi)型,還是instanceof操作符更可靠一些。
alert(person1 instanceof Object); alert(person1 instanceof Person); alert(person2 instanceof Object); alert(person2 instanceof Person); //都為true.
我們所創(chuàng)建的所有對(duì)象都是Object的實(shí)例,同時(shí)也是Person的實(shí)例。
創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來(lái)可以作為實(shí)例標(biāo)識(shí)為一種特定的類(lèi)型;構(gòu)造函數(shù)模式勝過(guò)工廠模式的地方
把構(gòu)造函數(shù)當(dāng)函數(shù)- 任何函數(shù),只要通過(guò) new 操作符來(lái)調(diào)用,那它就可以作為構(gòu)造函數(shù);
//當(dāng)做構(gòu)造函數(shù)使用
var person = new Person("Simon", 29, "software Engineer"); person.sayName(); //Simon //普通函數(shù)調(diào)用 Person("Genf", 23, "DOCTOR"); //添加到window window.sayName(); // Genf 以剛才的那種方式定義的構(gòu)造函數(shù)定義在Global對(duì)象中(在瀏覽器中是window對(duì)象),在全局作用域中調(diào)用函數(shù)時(shí),this指向的是window對(duì)象 // 在另外一個(gè)對(duì)象的作用域中調(diào)用 var o = new Object(); Person.call(o, "Kristen", 25, "nusd"); o.sayName(); // Kristen構(gòu)造函數(shù)的缺陷
每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。
person1 和 person2 都有一個(gè)名為 sayName() 的方法;但那兩個(gè)方法都不是同一個(gè) Function 的實(shí)例,因此會(huì)有不同的作用域鏈和標(biāo)識(shí)符解析;不同實(shí)例上的同名函數(shù)是不同的。
不要忘了,每個(gè)函數(shù)都是一個(gè)對(duì)象!所以sayName方法也可以這樣寫(xiě),因此每個(gè)Person實(shí)例都包含著不同的Function實(shí)例。以這種方式創(chuàng)建函數(shù),會(huì)導(dǎo)致不同餓作用域和標(biāo)識(shí)符解析。
this.sayName = new Function("alert(this.name)"); //與聲明函數(shù)在邏輯上是等價(jià)的
我們可以檢驗(yàn)下
alert(person1.sayName() == person2.sayName) //false;
創(chuàng)建兩個(gè)完成相同任務(wù)的Function 實(shí)例沒(méi)有必要,況且有this對(duì)象在,根本不用在執(zhí)行代碼前就把函數(shù)綁定到特定對(duì)象上面。
我們可以通過(guò)函數(shù)定義轉(zhuǎn)移構(gòu)造函數(shù)外部來(lái)解決這個(gè)問(wèn)題。
function Person(name, age ,job)
{ this.name = name; this.age = age; this.sayName = sayName; } function sayName() { alert(this.name); } var person1 = new Person("Simon", 29, "software Engineer"); var person2 = new Person("Zaynex", 29, "DOCTOR");
把sayName()函數(shù)的定義轉(zhuǎn)移到了構(gòu)造函數(shù)外部。
在構(gòu)造函數(shù)內(nèi)部,將sayName屬性設(shè)置成等于全局的 sayName 函數(shù)。這樣sayName 包含的是一個(gè)指向函數(shù)的指針。 person1和person2共享同一個(gè)sayName()函數(shù)。
但問(wèn)題是:
在全局作用域中定義的函數(shù)實(shí)際上只能被某個(gè)對(duì)象調(diào)用,如果對(duì)象需要定義很多方法,那么就要定義多個(gè)全局函數(shù)。
因此我們需要用原型模式來(lái)解決這個(gè)問(wèn)題。
原型模式我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè) prototype(原型) 屬性,這個(gè)屬性屬于指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途是包含可以由特定類(lèi)型的所有實(shí)例的共享的屬性和方法。即通過(guò)構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。
我們不必將構(gòu)造函數(shù)定義對(duì)象實(shí)例的信息中,而是可以將這些信息直接添加到對(duì)象原型中。
function Person(){ } Person.prototype.name ="Simon"; Person.prototype.age = 29; Person.prototype.job = "software Engineer"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1.sayName(); var person2 = new Person(); person2.sayName(); alert(person1.sayName == person2.sayName);
實(shí)際上,person1和person2都不包含屬性和方法, 但可以調(diào)用person1.sayName().這是通過(guò)查找對(duì)象屬性的過(guò)程來(lái)實(shí)現(xiàn)的。
理解原型對(duì)象無(wú)論何時(shí),只要?jiǎng)?chuàng)建了新函數(shù),就會(huì)根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個(gè) prototype 屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象。
在默認(rèn)情況下,所有原型都會(huì)自動(dòng)獲得一個(gè)constructor(構(gòu)造函數(shù))屬性,這個(gè)屬性包含在一個(gè)指向 prototype屬性所在的函數(shù)的指針。舉例說(shuō)明: Person.prototype.constructor 指向Person.
創(chuàng)建了自定義構(gòu)造函數(shù)之后,其原型對(duì)象默認(rèn)只會(huì)取得 constructor 屬性。其他方法都是從Object繼承來(lái)的。
調(diào)用構(gòu)造函數(shù)的一個(gè)實(shí)例后,該實(shí)例內(nèi)部將包含一個(gè)指針(ES5中稱(chēng)為[[Prototype]],指向構(gòu)造函數(shù)的原型對(duì)象。在腳本中沒(méi)有標(biāo)準(zhǔn)形式訪問(wèn)[[Prototype]],但在FF,SF,Chrome中的每個(gè)對(duì)象都支持屬性_proto_;在其他實(shí)現(xiàn)中,該屬性對(duì)腳本不可見(jiàn)。
要明確的是, 這個(gè)鏈接存在于實(shí)例與構(gòu)造函數(shù)的原型對(duì)象之間,而非實(shí)例與構(gòu)造函數(shù)之間。
雖然在現(xiàn)實(shí)中無(wú)法訪問(wèn)到[[Prototype]],但可以通過(guò) isPrototypeOf()來(lái)確定是否存在這種關(guān)系。
在ES5中新增一個(gè)方法,使用 Object.getPrototypeOf()可以方便的獲取一個(gè)對(duì)象的原型
每當(dāng)代碼讀取某個(gè)對(duì)象的某個(gè)屬性時(shí),都會(huì)執(zhí)行一次搜索, 1.先從實(shí)例本身開(kāi)始搜索屬性,存在,搜索結(jié)束。若不存在,執(zhí)行2 2.從實(shí)例的原型開(kāi)始搜索屬性。
繼續(xù)剛才的代碼。如果我們繼續(xù)給實(shí)例添加相同的屬性,會(huì)怎樣?
function Person(){ } Person.prototype.name ="Simon"; Person.prototype.age = 29; Person.prototype.job = "software Engineer"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); var person2 = new Person(); person1.name = "xiwenzheng"; alert(person1.name) //xiwenzheng ——來(lái)自實(shí)例 alert(person2.name) // Simon ——來(lái)自原型
在person1這個(gè)實(shí)例中重寫(xiě)屬性,那么解釋器搜索到了實(shí)例本身的屬性直接返回,對(duì)于person2而言,實(shí)例中沒(méi)有屬性,那么再往實(shí)例的原型開(kāi)始搜素屬性。
給對(duì)象添加一個(gè)屬性時(shí),這個(gè)屬性就會(huì)屏蔽原型對(duì)象中保存的同名屬性,就是阻止我們?cè)L問(wèn)原型對(duì)象,但并不會(huì)修改原型對(duì)象中的同名屬性。即使將person1.name 設(shè)置為 null 也不會(huì)影響原型對(duì)象中的同步屬性。
不過(guò)delete 實(shí)例屬性,就可以訪問(wèn)原型對(duì)象中的屬性了。
function Person(){
} Person.prototype.name ="Simon"; Person.prototype.age = 29; Person.prototype.job = "software Engineer"; Person.prototype.sayName = function(){ alert(this.name); };
var person1 = new Person(); var person2 = new Person(); person1.name = "xiwenzheng"; alert(person1.name); //xiwenzheng ——來(lái)自實(shí)例 alert(person2.name); // Simon ——來(lái)自原型 delete person1.name; alert(person1.name); // Simon 來(lái)自原型
使用hasOwnProperty()可以檢測(cè)一個(gè)屬性是否存在實(shí)例中還是存在原型中,這個(gè)方法只在給定屬性存在于對(duì)象實(shí)例中才會(huì)返回 true;
我們繼續(xù)采用剛才刪除部分的整段代碼。
alert(person1.hasOwnProperty("name")); // 返回false
原先person1.name是存在對(duì)象實(shí)例中的(被我們?cè)O(shè)為了"Zaynex"),但是被我們delete了。
如果我們不delete的話,那就是true了。要想獲得原型屬性的描述符,必須要在原型對(duì)象上調(diào)用 Object.hasOwnPropertydDsecriptor();
in 操作符會(huì)在通過(guò)對(duì)象能夠訪問(wèn)給定屬性時(shí)返回 true ,不論該實(shí)行存在于實(shí)例中還是原型中。
利用in:判斷是否有該屬性
利用hasOwnProperty()判斷是否存在對(duì)象實(shí)例中;
結(jié)合以后就可以判斷該屬性是在原型中還是在實(shí)例中。
function hasPrototypeProperty(object, name ){
return !object.hasOwnProperty(name) && (name in object);
}
person1.name = "Zaynex";
alert(hasPrototypeProperty(person1, "name")); //false;存在實(shí)例中
for-in 循環(huán)時(shí),返回的都是通過(guò)對(duì)象訪問(wèn)的、可枚舉的屬性(即將[[Enumberable]]標(biāo)記為true的屬性),在ES5中constructor 和 prototype屬性的 [[Enumberable]]
設(shè)為false,但并不是所有瀏覽器都照此實(shí)現(xiàn)。
想取得對(duì)象上所有可枚舉的實(shí)例屬性,可以使用Object.Keys()方法。
function Person(){ } Person.prototype.name ="Simon"; Person.prototype.age = 29; Person.prototype.job = "software Engineer"; Person.prototype.sayName = function(){ alert(this.name); }; var keys = Object.keys(Person.prototype); alert(keys);// name ,age, job, sayName var p1 = new Person(); p1.name = "Rob"; p1.age = 29; var p1keys = Object.keys(p1); alert(p1keys); // name ,age
如果想得到所有實(shí)例屬性,不論是否可枚舉,都可以使用 Object.getOwnPropertyNames()
var keys = Object.keys(Person.prototype); alert(keys);// constructor, name ,age, job, sayName更簡(jiǎn)單的原型語(yǔ)法
之前的例子中每添加一個(gè)屬性和方法都要 Person.prototype,我們進(jìn)行適當(dāng)?shù)姆庋b。
function Person(){ } Person.prototype = { name : "Simon", age : 29; job : "software Engineer", sayName : function () { alert(this.name); } };
我們將 Person.prototype 設(shè)置為等于一個(gè)以對(duì)象字面量形式創(chuàng)建的新對(duì)象。
之前介紹到,每創(chuàng)建一個(gè)函數(shù),同時(shí)會(huì)創(chuàng)建它的prototype對(duì)象,這個(gè)對(duì)象會(huì)指定獲得constructor 屬性。而我們?cè)谶@里的語(yǔ)法本質(zhì)上是重寫(xiě)了默認(rèn)的 prototype 對(duì)象。
所以 constructor屬性也編程了新對(duì)象的屬性。(指向Object構(gòu)造函數(shù)),不再指向Person了。
instanceof 測(cè)試 Object 和 Person 都返回 true,但constructor 屬性則等于Object而不等于 Person ;
如果 constructor 的值很重要,則可以特意設(shè)置回適當(dāng)?shù)闹?/p>
function Person(){ } Person.prototype = { constructor:Person, name : "Simon", job : "software Engineer", sayName : function () { alert(this.name); } }
注意,以這種方式重設(shè)constructor屬性會(huì)導(dǎo)致 [[Enumberable]]特性設(shè)置為true,但默認(rèn)我們是不可枚舉constructor屬性的。
為了兼容ES5的JS引擎,可以用 Object.defineProperty();
function Person(){ } Person.prototype = { name : "Simon", job : "software Engineer", sayName : function () { alert(this.name); } } Object.defineProperty(Person.prototype, "constructor", { enumerable: false, value: Person });原型的動(dòng)態(tài)性
在原型中找值的過(guò)程是一次搜索,因此我們對(duì)原型對(duì)象所做的任何修改都能立即從實(shí)例中反應(yīng)出來(lái)——即使是先創(chuàng)建實(shí)例后修改原型。
不信你看:
var friend = new Person(); Person.prototype.sayHi = function(){ alert("hi"); }; friend.sayHi(); // "hi"
這個(gè)可以歸結(jié)于實(shí)例與原型之間的松散鏈接關(guān)系。我們首先會(huì)在實(shí)例中搜索sayHi的屬性,在沒(méi)找到的情況下會(huì)繼續(xù)搜索原型,因?yàn)閷?shí)例與原型之間的鏈接只不過(guò)是一個(gè)指針。
但是如果重寫(xiě)整個(gè)原型對(duì)象,情況就不一樣了。調(diào)用構(gòu)造函數(shù)時(shí)會(huì)為實(shí)例添加一個(gè)指向最初原型的[[Prototype]]指針,而把原型修改為另外一個(gè)對(duì)象就等于切斷了構(gòu)造函數(shù)與最初原型之間的聯(lián)系。
請(qǐng)記住,實(shí)例中的指針僅指向原型,而不指向構(gòu)造函數(shù)。
function Person(){ } var friend = new Person(); Person.prototype = { constructor:Person, name : "Simon", job : "software Engineer", sayName : function () { alert(this.name); } }; friend.sayName(); //error
在這個(gè)例子中,我們創(chuàng)建了Person的實(shí)例,然后又重寫(xiě)了其原型對(duì)象,然后在調(diào)用sayName()時(shí)發(fā)生錯(cuò)誤,因此friend指向的原型不包含以該名字命名的屬性。
省略了為構(gòu)造函數(shù)傳遞初始化參數(shù)這一環(huán)節(jié),結(jié)果所有實(shí)例在默認(rèn)情況下都取得相同的屬性值。
共享導(dǎo)致的問(wèn)題,很多屬性可以共享,對(duì)于包含引用類(lèi)型值的屬性來(lái)說(shuō),問(wèn)題比較突出。
function Person(){
} Person.prototype = { constructor:Person, name : "Simon", job : "software Engineer", friends : ["Shelby", "Court"], sayName : function () { alert(this.name); } }; var person1 = new Person(); var person2 = new Person(); person1.friends.push("Van"); alert(person1.friends === person2.friends) // true;
修改person1.friends 引用的數(shù)組,添加字符串,由于 friends數(shù)組存在 Person.prototype 而非 person1中,所以修改也會(huì)造成person2.friends反映出來(lái),如果我們的初衷就是要共享同一個(gè)數(shù)組,那無(wú)話可說(shuō)。
可是一般都是要有屬于自己的全部屬性的。而這個(gè)問(wèn)題正是我們很少看到有人多帶帶使用原型模式的原因。
組合使用構(gòu)造函數(shù)模式和原型模式創(chuàng)建自定義類(lèi)型的最常見(jiàn)方式就是這個(gè)。構(gòu)造函數(shù)用于定義實(shí)例屬性,原型模式用于定義方法和共享的屬性。這樣,每個(gè)實(shí)例都會(huì)有自己的一份實(shí)例屬性的副本,但又同事共享著對(duì)方法的引用,最大限度節(jié)省了內(nèi)存。此外,這種混成模式還支持向構(gòu)造函數(shù)傳遞參數(shù)。
function Person (name, age, job){ this.name = name; this.age = age; this.job = job; this.friends = ["Shelby", "Court"]; } Person.prototype = { constructor : Person, sayName : function (){ alert(this.name); } } var person1 = new Person("Nicholas", 29, "software Engineer"); var person2 = new Person("Greg", 27, "DOCTOR"); person1.friends.push("Van"); alert(person1.friends); // Shelby,Court,Van alert(person2.friends); // shelby,Court alert(person1.friends === person2.friends); // false alert(person1.sayName === person2.sayName); // true
實(shí)例屬性都是在構(gòu)造函數(shù)中定義的,所有實(shí)例共享的屬性是在 constructor 和方法sayName()是在原型中定義的。
動(dòng)態(tài)原型模式當(dāng)其他OO語(yǔ)言經(jīng)驗(yàn)開(kāi)發(fā)人員看到獨(dú)立的構(gòu)造函數(shù)和原型時(shí),會(huì)感到困惑。因此出現(xiàn)了 動(dòng)態(tài)原型模式———即把所有信息都封裝在了構(gòu)造函數(shù)中,而通過(guò)在構(gòu)造函數(shù)中初始化原型(僅在必要的情況下),又保持了同事使用構(gòu)造函數(shù)和原型的優(yōu)點(diǎn)。
換句話說(shuō),可以通過(guò)檢查某個(gè)應(yīng)該存在的方法是否有效,來(lái)決定是否需要初始化原型。
function Person (name, age, job){ //屬性 this.name = name; this.age = age; this.job = job; this.friends = ["Shelby", "Court"]; if( typeof this.sayName != "function"){ Person.prototype.sayName = function() { alert(this.name); }; } } // 只有在sayName不存在的情況下, 才將其添加到原型中,這段代碼只會(huì)在初次調(diào)用函數(shù)時(shí)執(zhí)行。此后原型已經(jīng)完成初始化,不需要再做修改。 var friends1 = new Person("Nicholas", 29, "software Engineer"); var friends2 = new Person("Zaynex",19,"Engineer"); friends1.sayName(); friends2.sayName();
由于第一次當(dāng)friends1初始化之后,friends2就不需要再進(jìn)行初始化原型。
詳情參考點(diǎn)擊此處
在上述幾種模式都不適用的情況下,我們可以使用寄生構(gòu)造函數(shù)模式。
基本思想:創(chuàng)建一個(gè)函數(shù),該函數(shù)的作用僅僅是封裝對(duì)象的代碼,然后再返回新創(chuàng)建的對(duì)象。
function Person (name, age, job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); }; return o; } var friend = new Person ("Nicholas", 29, "software Engineer"); friend.sayName(); // Nicholas寄生構(gòu)造函數(shù)應(yīng)用
在特殊情況下為對(duì)象創(chuàng)建構(gòu)造函數(shù)。 假設(shè)我們想創(chuàng)建一個(gè)具有額外方法的特殊數(shù)組,由于不能直接修改Array構(gòu)造函數(shù),因此可以使用這個(gè)模式。
function SpecialArray(){ var values = new Array(); values.push.apply(values, arguments); values.toPipedString = function(){ return this.join("|"); } return values; } var colors = new SpecialArray("red", "blue", "green"); alert(colors.toPipedString()); // red|blue|green
寄生構(gòu)造函數(shù)模式:返回的對(duì)象與構(gòu)造函數(shù)或者與構(gòu)造函數(shù)的原型屬性沒(méi)有關(guān)系;不能依賴(lài)于 instanceof操作符確定對(duì)象類(lèi)型。因此不建議在已使用其他模式的情況下使用該種模式。
穩(wěn)妥構(gòu)造函數(shù)模式 應(yīng)用場(chǎng)景穩(wěn)妥對(duì)象,是指沒(méi)有公共屬性,其方法也不引用this的對(duì)象。適合在安全環(huán)境下(這些環(huán)境會(huì)禁止使用this 和 new),或者放置數(shù)據(jù)被其他應(yīng)用程序改動(dòng)時(shí)使用。
穩(wěn)妥函數(shù)與寄生構(gòu)造函數(shù)差異新創(chuàng)建的對(duì)象的實(shí)例方法不引用this。
不使用new 操作符調(diào)用構(gòu)造函數(shù)。
function Person(name, age, job) {
var o = new Object(); //可以在這里定義私有變量和函數(shù)。 // //添加方法 o.sayName = function(){ alert(name); }; //返回對(duì)象 return o;
}
var friend = Person("Nicholas", 29, "software Engineer");
friend.sayName();
以這種模式創(chuàng)建的對(duì)象,除了使用sayName()方法以外,沒(méi)有其他辦法訪問(wèn)name的值。
與計(jì)生構(gòu)造函數(shù)模式類(lèi)似,使用穩(wěn)妥構(gòu)造函數(shù)模式創(chuàng)建的對(duì)象與構(gòu)造函數(shù)之間沒(méi)有什么關(guān)系,因此instanceof操作符對(duì)這種對(duì)象沒(méi)有意義。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86385.html
摘要:在上百種語(yǔ)言中算是命好的一個(gè),還有就是最近納入高考體系的。由以下三個(gè)部分構(gòu)成。就是對(duì)實(shí)現(xiàn)該標(biāo)準(zhǔn)規(guī)定的各個(gè)方面內(nèi)容的語(yǔ)言的描述。是針對(duì)但經(jīng)過(guò)擴(kuò)展的用于的應(yīng)用程序編程接口。將頁(yè)面映射為由節(jié)點(diǎn)構(gòu)成的樹(shù)狀結(jié)構(gòu)。 JavaScript的歷史這里就不再贅述了,當(dāng)然JavaScript的歷史還是比較有意思的。在上百種語(yǔ)言中JavaScript算是‘命’好的一個(gè),還有就是最近納入高考體系的python...
摘要:數(shù)據(jù)類(lèi)型中有種簡(jiǎn)單數(shù)據(jù)類(lèi)型也稱(chēng)為基本數(shù)據(jù)類(lèi)型和。在中非空字符串,非零數(shù)字,任意對(duì)象,都被認(rèn)為。而空字符串,和,,認(rèn)為是。用于表示整數(shù)和浮點(diǎn)數(shù)。標(biāo)識(shí)符由數(shù)字字母下劃線美元符組成,但首字母不能是數(shù)字。變量方法對(duì)象命名推薦駝峰法。 JavaScript語(yǔ)法 一.語(yǔ)法簡(jiǎn)介 因?yàn)镴avaScript語(yǔ)法和Java等語(yǔ)法非常類(lèi)似。所以只是簡(jiǎn)單介紹一下。 大小寫(xiě) JavaScript是大小寫(xiě)敏感的語(yǔ)...
摘要:上一篇你不知道的筆記寫(xiě)在前面這是年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅(jiān)持健身三個(gè)月早睡早起游戲時(shí)間大大縮減,學(xué)會(huì)生活。 上一篇:《你不知道的javascript》筆記_this 寫(xiě)在前面 這是2019年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...
摘要:可以使用偵聽(tīng)器或處理程序來(lái)預(yù)訂事件,以便事件發(fā)生時(shí)執(zhí)行相應(yīng)的代碼。響應(yīng)某個(gè)事件的函數(shù)稱(chēng)為事件處理程序或事件偵聽(tīng)器??梢詣h除通過(guò)級(jí)方法指定的事件處理程序。 JavaScript和HTML之間的交互是通過(guò)事件實(shí)現(xiàn)的。 事件:文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互瞬間。 可以使用偵聽(tīng)器(或處理程序來(lái)預(yù)訂事件),以便事件發(fā)生時(shí)執(zhí)行相應(yīng)的代碼。 1. 事件流 事件流:從頁(yè)面中接收事件的順序。 ...
摘要:全局執(zhí)行環(huán)境的變量對(duì)象始終是作用域鏈中的最后一個(gè)變量對(duì)象。綜上,每個(gè)函數(shù)對(duì)應(yīng)一個(gè)執(zhí)行環(huán)境,每個(gè)執(zhí)行環(huán)境對(duì)應(yīng)一個(gè)變量對(duì)象,而多個(gè)變量對(duì)象構(gòu)成了作用域鏈,如果當(dāng)前執(zhí)行環(huán)境是函數(shù),那么其活動(dòng)對(duì)象在作用域鏈的前端。 1.幾個(gè)概念 先說(shuō)幾個(gè)概念:函數(shù)、執(zhí)行環(huán)境、變量對(duì)象、作用域鏈、活動(dòng)對(duì)象。這幾個(gè)東東之間有什么關(guān)系呢,往下看~ 函數(shù) 函數(shù)大家都知道,我想說(shuō)的是,js中,在函數(shù)內(nèi)部有兩個(gè)特殊...
摘要:實(shí)現(xiàn)原型鏈的方式如下讓原型對(duì)象稱(chēng)為另一個(gè)構(gòu)造函數(shù)的實(shí)例這個(gè)實(shí)例繼承了的屬性上述代碼繼承是通過(guò)來(lái)實(shí)現(xiàn),創(chuàng)建的實(shí)例,并將該實(shí)例賦給。無(wú)疑,集兩者之大成,這才是最常用的繼承模式。 原型鏈 JavaScript的繼承主要依靠原型鏈來(lái)實(shí)現(xiàn)的。我們知道,構(gòu)造函數(shù),原型,和實(shí)例之間的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針,而實(shí)例都包含一個(gè)原型對(duì)象的指針。 實(shí)現(xiàn)原型鏈...
閱讀 2953·2023-04-26 01:49
閱讀 2082·2021-10-13 09:39
閱讀 2294·2021-10-11 11:09
閱讀 936·2019-08-30 15:53
閱讀 2825·2019-08-30 15:44
閱讀 932·2019-08-30 11:12
閱讀 2992·2019-08-29 17:17
閱讀 2385·2019-08-29 16:57