摘要:返回一個布爾值,指示指定的對象是否位于調用此方法的對象的原型鏈中。
JavaScript - Prototype
JavaScript是一門動態(tài)語言, 你可以在任何時候向對象上添加屬性,如下
function Student() { this.name = "LeBron James"; this.gender = "Male"; } var studObj1 = new Student(); studObj1.age = 15; alert(studObj1.age); // 15 var studObj2 = new Student(); alert(studObj2.age); // undefined
正如上面的實例, age 屬性附加在 studObj1 實例上. 然而 studObj2 實例沒有這個屬性, 因為 age 屬性只在 studObj1 實例上定義了.
那么, 如果想在后期添加一個屬性且能被所有的實例所共享, 該怎么辦? 答案這就今天主角 Prototype.
Prototype 是一個對象, 默認情況下與JavaScript中的任何一個函數或對象有關, 只是唯一區(qū)別在于函數的prototype 屬性是可訪問和可修改的,而對象的prototype屬性是不可見的.
默認情況下任何一個函數包含 Prototype 對象, 如下圖:
prototype 對象是一種特殊類型的可枚舉對象, 可以將需要附加屬添加到其上,這些屬性將在其構造函數的所有實例之間共享。
因此, 把上面的示例中使用函數的 prototype 來添加屬性,以便于所有對象中都可以訪問到, 如下:
function Student() { this.name = "LeBron James"; this.gender = "M"; } Student.prototype.age = 15; var studObj1 = new Student(); alert(studObj1.age); // 15 var studObj2 = new Student(); alert(studObj2.age); // 15
使用 字面量 或 通過 new關鍵字和構造函數 的方式創(chuàng)建的每一個對象都包含 __proto__ 屬性, 該屬性指向創(chuàng)建此對象的函數的 原型對象.
你可以在谷歌和火狐開發(fā)者調試工具中查看該屬性(__proto__) , 根據下面的示例:
function Student() { this.name = "LeBron James"; this.gender = "M"; } var studObj = new Student(); console.log(Student.prototype); // object console.log(studObj.prototype); // undefined console.log(studObj.__proto__); // object console.log(typeof Student.prototype); // object console.log(typeof studObj.__proto__); // object console.log(Student.prototype === studObj.__proto__ ); // true
正如上面例子看到, 函數通過 [[函數名稱]].prototype 方式訪問到原型對象. 但是, 對象(實例)并沒有暴露出 prototype 屬性,而是使用 __proto__ 來訪問它.
Object 對象的原型前面提及到, 原型對象在對象中是不可見. 使用 Object.getPrototypeOf(obj) 方法來訪問實例的原型對象. (這也是推薦方式, __proto__ 并不是標準屬性, 在IE11以下其它瀏覽器中沒有實現).
function Student() { this.name = "LeBron James"; this.gender = "M"; } var studObj = new Student(); Student.prototype.sayHi= function(){ alert("Hi"); }; var studObj1 = new Student(); var proto = Object.getPrototypeOf(studObj1); // returns Student"s prototype object alert(proto.constructor); // returns Student function
Object 原型對象包含如下 屬性 和 方法
屬性 | 描述 |
---|---|
constructor | 返回創(chuàng)建該實例的構造函數 |
__proto__ | 指向創(chuàng)建該實例的構造函數的原型對象. |
方法 | 描述 |
---|---|
hasOwnProperty() | 返回一個布爾值,指示對象是否包含指定的屬性作為該對象的直接屬性,而不是通過原型鏈繼承。 |
isPrototypeOf() | 返回一個布爾值,指示指定的對象是否位于調用此方法的對象的原型鏈中。 |
propertyIsEnumerable() | 返回一個布爾值,該布爾值指示指定的屬性是否可枚舉。 |
toLocaleString() | 返回本地格式的字符串. |
toString() | 返回對象字符串形式. |
valueOf() | 返回指定對象的原始值. |
Chrome 和 Firfox 將對象的原型表示為 __proto__, 而內部引用為 [[Prototype]]. IE不支持,只有IE11包含它.
修改原型如上所述, 每個對象都能鏈接到函數的原型對象. 如果您更改了函數的原型, 則只有新對象將鏈接到更改后的原型. 所有其他現有對象仍然鏈接到舊的函數原型. 下面實例來演示這個場景:
function Student() { this.name = "LeBron James"; this.gender = "M"; } Student.prototype.age = 15; var studObj1 = new Student(); alert("studObj1.age = " + studObj1.age); // 15 var studObj2 = new Student(); alert("studObj2.age = " + studObj2.age); // 15 Student.prototype = { age : 20 }; var studObj3 = new Student(); alert("studObj3.age = " + studObj3.age); // 20 alert("studObj1.age = " + studObj1.age); // 15 alert("studObj2.age = " + studObj2.age); // 15使用原型
原型對象被JavaScript引擎用來做兩件事:
查找對象的屬性和方法
在JavaScript中實現繼承
function Student() { this.name = "LeBron James"; this.gender = "M"; } Student.prototype.sayHi = function(){ alert("Hi"); }; var studObj = new Student(); studObj.toString();
在上面的示例, toString() 方法在 Student 中沒有定義, 那么它是如何以及從哪里找到 toString() 的呢?
在這里,原型出現了. 首先, JavaScript 引擎檢查 studObj 是否存在 toString 方法?. 如果沒有找到,那么它使用 studObj 的 __proto__ 鏈接指向 Student函數 的 原型對象. 如果它仍然無法找到它那么它會在往上層并檢查 Object 函數的原型對象,因為所有對象都是從 JavaScript 中的 Object 派生的,并查找 toString() 方法. 因此, 它在Object函數的原型對象中找到 toString() 方法,因此我們可以調用 studObj.toString().
查找方式,如下圖所示
上述就是原型基本知識點以及應用.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/105362.html
摘要:醞釀許久之后,筆者準備接下來撰寫前端面試題系列文章,內容涵蓋瀏覽器框架分鐘搞定常用基礎知識前端掘金基礎智商劃重點在實際開發(fā)中,已經非常普及了。 這道題--致敬各位10年阿里的前端開發(fā) - 掘金很巧合,我在認識了兩位同是10年工作經驗的阿里前端開發(fā)小伙伴,不但要向前輩學習,我有時候還會選擇另一種方法逗逗他們,拿了網上一道經典面試題,可能我連去阿里面試的機會都沒有,但是我感受到了一次面試1...
摘要:忍者級別的函數操作對于什么是匿名函數,這里就不做過多介紹了。我們需要知道的是,對于而言,匿名函數是一個很重要且具有邏輯性的特性。通常,匿名函數的使用情況是創(chuàng)建一個供以后使用的函數。 JS 中的遞歸 遞歸, 遞歸基礎, 斐波那契數列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機制,如果...
摘要:前言月份開始出沒社區(qū),現在差不多月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了一般來說,差不多到了轉正的時候,會進行總結或者分享會議那么今天我就把看過的一些學習資源主要是博客,博文推薦分享給大家。 1.前言 6月份開始出沒社區(qū),現在差不多9月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了!一般來說,差不多到了轉正的時候,會進行總結或者分享會議!那么今天我就...
閱讀 2043·2019-08-30 15:54
閱讀 3675·2019-08-29 13:07
閱讀 3195·2019-08-29 12:39
閱讀 1876·2019-08-26 12:13
閱讀 1621·2019-08-23 18:31
閱讀 2236·2019-08-23 18:05
閱讀 1914·2019-08-23 18:00
閱讀 1111·2019-08-23 17:15