摘要:當(dāng)作構(gòu)造函數(shù)來使用,作為普通函數(shù)來使用,當(dāng)在全局作用域中調(diào)用一個(gè)函數(shù)時(shí),對(duì)象總是指向?qū)ο?。調(diào)用構(gòu)造函數(shù)時(shí)會(huì)為實(shí)例添加一個(gè)指向最初原型的的指針,而把原型修改為另外一個(gè)對(duì)象就等于切斷了構(gòu)造函數(shù)于最初原型之間的聯(lián)系。
ECMA-262 把對(duì)象定義為
無序?qū)傩缘募希鋵傩钥梢园局?、?duì)象或者函數(shù)。
即對(duì)象是一組沒有特定順序的值。對(duì)象的每個(gè)屬性或方法都有一個(gè)名字,而每個(gè)名字都映射到一個(gè)值。正因?yàn)檫@樣,我們可以把 ECMAScript 的對(duì)象想象成散列表:無非就是一組名值對(duì),其中值可以是數(shù)據(jù)或函數(shù)。
理解對(duì)象 屬性類型ECMAScript 第 5 版 在定義只有內(nèi)部采用的特性(attribute)時(shí), 描述了屬性(property)的各種特征。ECMAScript 定義這些特性是為了實(shí)現(xiàn) JavaScript 引擎用的,因此在 JavaScript 中不能直接訪問它們。為表示特性是內(nèi)部值,該規(guī)范把它們放在兩對(duì)方括號(hào)中,例如 [[Enuermerable]]。
ECMAScript 中只有兩種屬性:數(shù)據(jù)屬性和訪問器屬性。
數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位置。在這個(gè)位置可以讀取和寫入值。數(shù)據(jù)屬性有描述其行為的特性4個(gè):
[[Configurable]]: 表示能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。
[[Enumberable]]: 表示能否通過 for-in 循環(huán)返回屬性。
[[Writable]]: 表示能否修改屬性的值。
[[value]]:包含這個(gè)屬性的數(shù)據(jù)值。讀取屬性值的時(shí)候,從這個(gè)位置讀;寫入屬性值的時(shí)候,把新值保存在這個(gè)位置。
要修改屬性默認(rèn)的特性,必須用 ECMAScript 5 的 Object.defineProperty() 方法。這個(gè)方法接受三個(gè)參數(shù)`: 屬性所在的對(duì)象,屬性名,和一個(gè)描述符對(duì)象。其中,描述符(descriptor)對(duì)象的屬性必須是:configurable、enumerable、writable 和 value。
jsvar person = {}; Object.defineProperty(person,"name",{ writable: false, value: "Nicholas", configurable: false }); alert(person.name);//"Nicholas" person.name = "PaddingMe"; alert(person.name);//"Nicholas" delete person.name; alert(person.name);//"Nicholas"
一旦把屬性定義為不可配置特性就不能再把它變?yōu)榭膳渲谩?/p>
在調(diào)用 Object.defineProperty() 方法時(shí),如果不指定, configurable, enumerable 和 writable 特性的默認(rèn)值為 false。
訪問器屬性
訪問器屬性不包含數(shù)據(jù)值,他們包含一對(duì) getter 和 setter 函數(shù)(不過不是必須的),在讀取訪問器屬性時(shí),會(huì)調(diào)用 getter 函數(shù),這個(gè)函數(shù)負(fù)責(zé)返回有效的值。在寫入訪問器屬性時(shí),會(huì)調(diào)用 setter 函數(shù)并傳入新值,此函數(shù)負(fù)責(zé)決定如何處理數(shù)據(jù)。訪問器也有4個(gè)特性:
[[Configurable]]: 表示能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。
[[Enumberable]]: 表示能否通過 for-in 循環(huán)返回屬性。
[[get]]: 在讀取屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為 undefined。
[[set]]: 在寫入屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為 undefined。
訪問器不能直接定義,必須使用 object.defineProperty() 來定義。
var book = { _year: 2004, edition: 1 }; Object.defineProperty(book, "year", { get: function() { return this._year; }, set: function() { if (newValue > 2004) { this._year = newValue; this.edition += newValue -2004; } } }); book.year = 2005; alert(book.edition); //2
_year 前面的下劃線用于表示只能通過對(duì)象方法訪問的屬性。book.edition 變?yōu)?2 這是使用訪問器屬性的常見方式。即設(shè)置一個(gè)屬性的值會(huì)導(dǎo)致其他屬性發(fā)生變化。
定義多個(gè)屬性Object.definePorperties() 接受兩個(gè)對(duì)象參數(shù):第一個(gè)要添加或修改其屬性的對(duì)象,第二個(gè)對(duì)象的屬性 與第一個(gè)對(duì)象中要添加或修改的屬性一一對(duì)應(yīng)。
讀取屬性的特性Object.getOwnPropertyDescriptor() 方法獲取給定屬性的描述符。
此方法接受2個(gè)參數(shù):屬性所在的對(duì)象和要讀取其描述符的屬性名稱。
返回值是一個(gè)對(duì)象。
jsvar book = {}; Object.defineProperties(book,{ _year: {value: 2004}, edition: {value: 1}, year: { get: function() { return this._year; }, set: function() { if (newValue > 2004) { this._year = newValue; this.edition += newValue -2004; } } } }); var descriptor = Object.getOwnPropertyDescriptor(book,"_year"); alert(descriptor.value); //2004 alert(descriptor.configurable);//false alert(typeof descriptor.get); // "undefined" var descriptor = Object.getOwnPropertyDescriptor(book,"year"); alert(descriptor.value); //undefined alert(descriptor.enumerable);//false alert(typeof descriptor.get); //function創(chuàng)建對(duì)象
最簡(jiǎn)單的可以用 Object 構(gòu)造函數(shù),或者對(duì)象字面量來創(chuàng)建單個(gè)對(duì)象,但這樣使用一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量的重復(fù)代碼。
jsvar paddingme = new Object(); //用 Object 構(gòu)造函數(shù) 創(chuàng)建對(duì)象 var paddingme = {}; //對(duì)象字面量創(chuàng)建對(duì)象工廠模式
工廠模式是用函數(shù)來封裝以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)。
jsfunction 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 person = createPerson("PaddingMe",25,"front-end developer");
工廠模式雖然解決了創(chuàng)建多個(gè)相似對(duì)象的問題,但沒有解決對(duì)象識(shí)別的問題(即怎樣知道一個(gè)對(duì)象的類型)。
構(gòu)造函數(shù)模式js function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function() { alert(this.name); }; } var person1 = new Person("PaddingMe",25,"front-end developer"); alert(person1.constructor == Person);//true alert(person1 instanceof Person);//true alert(person1 instanceof Object);//true
構(gòu)造函數(shù)模式與工廠模式不同的是:
- 沒有顯式地創(chuàng)建對(duì)象;
- 沒有 return 語句;
- 直接將屬性和方法賦給了 this 方法。
另按照慣例,構(gòu)造函數(shù)首字母都應(yīng)該大寫。
創(chuàng)建 Person 新實(shí)例,經(jīng)過了以下4個(gè)新步驟:
創(chuàng)建一個(gè)新對(duì)象;
將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此 this 就指向了這個(gè)新對(duì)象);
執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對(duì)象添加屬性);
返回新對(duì)象。
創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來可以將它的實(shí)例標(biāo)識(shí)為一種特殊的類型,而這正是構(gòu)造函數(shù)模式勝過工廠模式的地方。
js //當(dāng)作構(gòu)造函數(shù)來使用 var person = new Person("paddingme",25,"F2ER"); person.sayName();//"paddingme" //作為普通函數(shù)來使用; Person("paddingme",25,"F2ER"); window.sayName();//"paddingme" //**當(dāng)在全局作用域中調(diào)用一個(gè)函數(shù)時(shí),this 對(duì)象總是指向 Global 對(duì)象。** //在另一個(gè)對(duì)象的作用域中調(diào)用 var o = new Object(); Person.call(o,"paddingme",25,"F2ER"); o.sayName();// "paddingme"
構(gòu)造函數(shù)創(chuàng)建對(duì)象的問題在于:每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍,會(huì)導(dǎo)致不同的作用域鏈和標(biāo)識(shí)符解析。不同實(shí)例上的同名函數(shù)是不相等的。
原型模式我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè) prototype(原型) 屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法。 按照字面意思即 prototype 就是調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。使用原型對(duì)象的好處就是可以讓所有對(duì)象實(shí)例共享它所包含的屬性和方法。換言之,不必在構(gòu)造函數(shù)中定義實(shí)例的信息,而是可以將這些信息直接添加到原型對(duì)象中。
js function Person() {} Person.prototype.name = "PaddingMe"; Person.prototype.age = 29; Person.prototype.job = "Front-end Engineer"; Person.prototype.sayName = function () { alert(this.name); }; var person1 = new Person(); person1.sayName(); //"PaddingMe" var person2 = new Person(); person2.sayName(); //"PaddingMe"
理解原型對(duì)象
無論什么時(shí)候,只要?jiǎng)?chuàng)建一個(gè)新函數(shù),就會(huì)根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個(gè) prototype 屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象。在默認(rèn)情況下,所有原型對(duì)象都會(huì)自動(dòng)獲得一個(gè) constructor 屬性。這個(gè)屬性包含一個(gè)指向所在函數(shù)的指針。 創(chuàng)建了自定義的構(gòu)造函數(shù)之后,其原型對(duì)象默認(rèn)只會(huì)取得 constructor 屬性;至于其他方法,都是從 Object 繼承而來的。當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建一個(gè)新實(shí)例后,該實(shí)例的內(nèi)部將包含一個(gè)指針(內(nèi)部屬性),指向構(gòu)造函數(shù)的原型對(duì)象。ECMAScript 管此指針叫 [[prototype]]
Person 構(gòu)造函數(shù)、 Person 的原型屬性以及 Person 現(xiàn)有的兩個(gè)實(shí)例之間的關(guān)系。在此,Person.prototype 指向了原型對(duì)象,而 Person.prototype.constructor 又指回了 Person。 原型對(duì)象中除了包含 constructor 屬性之外,還包括后來添加的其他屬性。 Person 的每個(gè)實(shí)例都包含一個(gè)內(nèi)部屬性,該屬性指向了 Person.prototype;換句話說,它們與構(gòu)造函數(shù)沒有直接的關(guān)系。
js alert(Person.prototype.isPrototype(person1));//true alert(Person.prototype.isPrototype(person2));//true
ECMASript 5 增加了Object.getPrototypeOf(),在所有支持的實(shí)現(xiàn)中,這個(gè)方法返回[[Prototype]] 的值。
jsalert(Object.getPrototypeOf(person1) == Person.prototype); // true alert(Object.getPrototypeOf(person1).name); // "PaddingMe"
每當(dāng)代碼讀取某個(gè)對(duì)象的某個(gè)屬性時(shí),都會(huì)執(zhí)行一次搜索,目標(biāo)是具有給定名字的屬性。搜索首先從對(duì)象實(shí)例本身開始。若在實(shí)例中找到了具有給定名字的屬性,則返回該屬性的值。若沒有,則繼續(xù)搜索指針指向的原型鍍錫i昂,在原型對(duì)象中查找是否具有給定名字的屬性。若在原型對(duì)象中找到此屬性,則返回該屬性的值。
原型最初只包括 constructor 屬性,而該屬性也是共享的,因此可以通過對(duì)象實(shí)例訪問
當(dāng)為對(duì)象實(shí)例添加一個(gè)屬性時(shí),這個(gè)屬性就會(huì)屏蔽原型對(duì)象中同名屬性,換句話說,添加這個(gè)屬性只會(huì)阻止我們?cè)L問原型對(duì)象中的屬性,而不會(huì)修改那個(gè)屬性。
使用 hasOwnProperty() 方法可以檢測(cè)一個(gè)屬性是存在于實(shí)例中,還是存在于原型中。
這個(gè)方法(它繼承于 Object)只在給定屬性存在于對(duì)象實(shí)例中,才會(huì)返回 true。
jsfunction Person() {} Person.prototype.name = "PaddingMe"; Person.prototype.age = 29; Person.prototype.job = "Front-end Engineer"; Person.prototype.sayName = function () { alert(this.name); }; var person1 = new Person(); var person2 = new Person(); alert(person1.hasOwnProperty("name"));//false person2.name = "hhb"; alert(person2.hasOwnProperty("name"));//true delete person2.name; alert(person2.hasOwnProperty("name"));//false
原型與 in 操作符
在多帶帶使用時(shí),in 操作符會(huì)在通過對(duì)象能夠訪問給定屬性時(shí)返回 true,無論該屬性是在實(shí)例中還是原型中。與 hasOwnProperty() 一起使用可以確定該屬性到底是在對(duì)象中,還是存在于原型中。
jsfunction hasPrototypeProperty(){ return !object.hasOwnProperty(name) && (name in object); }
在使用 for-in 循環(huán)時(shí), 返回的是所有能夠通過對(duì)象訪問的、可枚舉(enumerated)屬性,其中既包括存在于實(shí)例中的屬性,也包括存在于原型中的屬性。屏蔽了原型中不可枚舉屬性的實(shí)例屬性也會(huì)返回,因?yàn)楦鶕?jù)規(guī)定,所有開發(fā)人員定義的屬性都是可枚舉的——只有在 IE8 以及更早版本中例外。
要去的對(duì)象上所有可枚舉的實(shí)例屬性,可使用 ECMAScript 5 中的 Object.keys() 方法。此方法要接受一個(gè)對(duì)象作為參數(shù),返回一個(gè)包含所有可枚舉屬性的字符串組。
jsfunction Person() {} Person.prototype.name = "PaddingMe"; Person.prototype.age = 29; Person.prototype.job = "Front-end 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 = "hhb"; p1.age = 25; var p1keys = Object.keys(p1); alert(p1keys);// "name,age"
想要得到所有的實(shí)例屬性,無論它是否可枚舉,可以使用 Object.getOwnPropertyNames() 方法。
jsvar keys = Object.getOwnPropertyNames(Person.prototype); alert(keys);// "constructor,name,age,job,sayName"
更簡(jiǎn)單的原型方法
用對(duì)象自變量來重寫真哥哥原型對(duì)象。
jsfunction Person(){ } Person.prototype = { name : "PaddingMe", age : 25, job : "F2ER", sayName : function() { alert(this.name); } };
注意 constructor 屬性不再指向 Person,而是指向了 Object 構(gòu)造函數(shù)。
jsfunction Person(){ } Person.prototype = { constructor: Person, name : "PaddingMe", age : 25, job : "F2ER", sayName : function() { alert(this.name); } };
原型的動(dòng)態(tài)性
對(duì)原型對(duì)象所在的任何修改都能夠立即從實(shí)例上反映出來—— 即使是先創(chuàng)建了實(shí)例后修改原型也是一樣的。但若是重寫整個(gè)原型對(duì)象,情況就不一樣了。
調(diào)用構(gòu)造函數(shù)時(shí)會(huì)為實(shí)例添加一個(gè)指向最初原型的 [[prototype]] 的指針,而把原型修改為另外一個(gè)對(duì)象就等于切斷了構(gòu)造函數(shù)于最初原型之間的聯(lián)系。實(shí)例中的指針只指向原型,而不指向構(gòu)造函數(shù)。
jsfunction Person() { } var friend = new Person(); Person.prototype = { constuctor : Person, name : "PaddingMe", age : 25, sayName : function(){ alert(this.name); } }; friend.sayName(); //error
原生對(duì)象的原型
jsString.prototype.startsWith = function (text) { return this.indexOf(text) == 0; } var msg = "Hello world!"; alert(msg.startsWith("Hello")); //true
原型對(duì)象的問題
所有實(shí)例在默認(rèn)情況下都將取得相同的屬性值。原型模式的最大問題是由其共享的本性所導(dǎo)致。
jsfuntion Person(){ } Person.prototype = { constuctor: Person, name: "PaddingMe", age: 26, job: "F2ER", friends: ["hw","wjj"], sayName: function() { alert(this.name); } }; var person1 = new Person(); var person2 = new Person(); Person1.friends.push("ex"); alert(person1.friends);//"hw,wjj,ex" alert(person2.friends);//"hw,wjj,ex" alert(person1.friends == person2.friends);//true組合使用構(gòu)造函數(shù)模式和原型模式
構(gòu)造函數(shù)模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享的屬性。
jsfunction Person(name,age,job) { this.name = name; this.age = age; this.job = job; this.friends = ["hw","wjj"]; } Person.prototype = { constructor: Person, sayName: function() { alert(this.name); } } var person1 = new Person("winter",59,"Full-Stack Enginner"); var person2 = new Person("PaddingMe",25,"F2ER"); person1.friends.push("ex"); alert(person1.friends); // "hw,wjj,ex" alert(person2.friends); // "hw,wjj" alert(person1.friends == person2.friends); //false alert(person1.sayName == person2.sayName); //true動(dòng)態(tài)原型模式
jsfunction Person(name,age,job) { this.name = name; this.age = age; this.job = job; if(typeof this.sayName != "funtion") { Person.prototype.sayName = function(){ alert(this.name); }; } } var friend = new Person("PaddingMe",25,"F2ER"); friend.sayName();寄生構(gòu)造函數(shù)模式
寄生(parasitic)構(gòu)造函數(shù)模式的基本思想是:創(chuàng)建一個(gè)函數(shù),該函數(shù)的作用僅僅是封裝創(chuàng)建對(duì)象的代碼,然后再返回新創(chuàng)建的對(duì)象;但從表面上看,有很像典型的構(gòu)造函數(shù)。
jsfunction 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("PaddingMe",25,"F2ER"); friend.sayName;// "PaddingMe"
js function SpecialArray() { var values = new Array(); values.push.apply(values,arguments); values.toPipedString = function() { return this.join("|"); } } var colors = new SpecialArray("red","blue","green"); alert(colors.toPipedString());//"red|blue|green"
關(guān)于寄生構(gòu)造函數(shù)模式需要說明的是:
返回的對(duì)象與構(gòu)造函數(shù)或者與構(gòu)造函數(shù)的原型屬性之間沒有關(guān)系,亦即構(gòu)造函數(shù)返回的都喜愛那個(gè)與在構(gòu)造函數(shù)外部建立的對(duì)象沒什么不同。所以不能依賴 instanceof 操作符來確定對(duì)象模型。
所謂穩(wěn)妥對(duì)象是指沒有公共屬性,而且其方法也引用 this 的對(duì)象。穩(wěn)妥對(duì)象最適合在一些安全的環(huán)境中(這些環(huán)境中會(huì)禁止使用 this 和 new),或者在防止數(shù)據(jù)被其他應(yīng)用程序(如 Mashup 程序)改動(dòng)時(shí)使用。
穩(wěn)妥構(gòu)造函數(shù)模式與寄生構(gòu)造函數(shù)模式不一樣的是:
- 新創(chuàng)建對(duì)象的實(shí)例方法不引用 this;
- 不使用 new 操作符調(diào)用構(gòu)造函數(shù)。
jsfunction Person(name,age,job) { var o = new Object(); o.sayName = function (){ alert(name); }; return o; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85476.html
摘要:對(duì)象有狀態(tài)對(duì)象具有狀態(tài),同一對(duì)象可能處于不同狀態(tài)之下。中對(duì)象獨(dú)有的特色對(duì)象具有高度的動(dòng)態(tài)性,這是因?yàn)橘x予了使用者在運(yùn)行時(shí)為對(duì)象添改狀態(tài)和行為的能力。小結(jié)由于的對(duì)象設(shè)計(jì)跟目前主流基于類的面向?qū)ο蟛町惙浅4?,?dǎo)致有不是面向?qū)ο筮@樣的說法。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些...
摘要:對(duì)象有狀態(tài)對(duì)象具有狀態(tài),同一對(duì)象可能處于不同狀態(tài)之下。中對(duì)象獨(dú)有的特色對(duì)象具有高度的動(dòng)態(tài)性,這是因?yàn)橘x予了使用者在運(yùn)行時(shí)為對(duì)象添改狀態(tài)和行為的能力。小結(jié)由于的對(duì)象設(shè)計(jì)跟目前主流基于類的面向?qū)ο蟛町惙浅4螅瑢?dǎo)致有不是面向?qū)ο筮@樣的說法。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些...
摘要:對(duì)象有狀態(tài)對(duì)象具有狀態(tài),同一對(duì)象可能處于不同狀態(tài)之下。中對(duì)象獨(dú)有的特色對(duì)象具有高度的動(dòng)態(tài)性,這是因?yàn)橘x予了使用者在運(yùn)行時(shí)為對(duì)象添改狀態(tài)和行為的能力。小結(jié)由于的對(duì)象設(shè)計(jì)跟目前主流基于類的面向?qū)ο蟛町惙浅4螅瑢?dǎo)致有不是面向?qū)ο筮@樣的說法。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開的一個(gè)專欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過程的一些...
摘要:子類繼承自父類的方法可以重新定義即覆寫,被調(diào)用時(shí)會(huì)使用子類定義的方法什么是多態(tài)青蛙是一個(gè)對(duì)象,金魚也是一個(gè)對(duì)象,青蛙會(huì)跳,金魚會(huì)游,定義好對(duì)象及其方法后,我們能用青蛙對(duì)象調(diào)用跳這個(gè)方法,也能用金魚對(duì)象調(diào)用游這個(gè)方法。 1、專用術(shù)語 面向?qū)ο缶幊坛绦蛟O(shè)計(jì)簡(jiǎn)稱:OOP,在面向?qū)ο缶幊讨谐S玫降母拍钣校簩?duì)象、屬性、方法、類、封裝、聚合、重用與繼承、多態(tài)。 2、什么是對(duì)象? 面向?qū)ο缶幊痰闹攸c(diǎn)...
摘要:即另外,注意到構(gòu)造函數(shù)里的屬性,都沒有經(jīng)過進(jìn)行初始化,而是直接使用進(jìn)行綁定。并且在模式下,構(gòu)造函數(shù)沒有使用進(jìn)行調(diào)用,也會(huì)導(dǎo)致報(bào)錯(cuò)。調(diào)用構(gòu)造函數(shù)千萬不要忘記寫。 1. 基礎(chǔ) JavaScript不區(qū)分類和實(shí)例的概念,而是通過原型來實(shí)現(xiàn)面向?qū)ο缶幊?。Java是從高級(jí)的抽象上設(shè)計(jì)的類和實(shí)例,而JavaScript的設(shè)計(jì)理念,聽起來就好比Heros里的Peter,可以復(fù)制別人的能力。JavaS...
閱讀 1920·2021-11-24 11:16
閱讀 3273·2021-09-10 10:51
閱讀 3228·2021-08-03 14:03
閱讀 1275·2019-08-29 17:03
閱讀 3256·2019-08-29 12:36
閱讀 2242·2019-08-26 14:06
閱讀 506·2019-08-23 16:32
閱讀 2708·2019-08-23 13:42