溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript中的原型是什么

發(fā)布時(shí)間:2021-11-06 11:18:06 來源:億速云 閱讀:139 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“JavaScript中的原型是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“JavaScript中的原型是什么”吧!

JavaScript是一門動(dòng)態(tài)語言, 你可以在任何時(shí)候向?qū)ο笊咸砑訉傩?如下

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

正如上面的實(shí)例, age 屬性附加在 studObj1 實(shí)例上. 然而 studObj2 實(shí)例沒有這個(gè)屬性, 因?yàn)?age 屬性只在 studObj1  實(shí)例上定義了.

那么, 如果想在后期添加一個(gè)屬性且能被所有的實(shí)例所共享, 該怎么辦? 答案這就今天主角 Prototype.

Prototype 是一個(gè)對象, 默認(rèn)情況下與JavaScript中的任何一個(gè)函數(shù)或?qū)ο笥嘘P(guān), 只是唯一區(qū)別在于函數(shù)的prototype  屬性是可訪問和可修改的,而對象的prototype屬性是不可見的.

默認(rèn)情況下任何一個(gè)函數(shù)包含 Prototype 對象, 如下圖:

JavaScript中的原型是什么

prototype 對象是一種特殊類型的可枚舉對象, 可以將需要附加屬添加到其上,這些屬性將在其構(gòu)造函數(shù)的所有實(shí)例之間共享。

我自己是一名從事了多年開發(fā)的web前端老程序員,目前辭職在做自己的web前端私人定制課程,今年年初我花了一個(gè)月整理了一份最適合2019年學(xué)習(xí)的web前端學(xué)習(xí)干貨,各種框架都有整理,送給每一位前端小伙伴。

因此, 把上面的示例中使用函數(shù)的 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關(guān)鍵字和構(gòu)造函數(shù) 的方式創(chuàng)建的每一個(gè)對象都包含 __proto__ 屬性, 該屬性指向創(chuàng)建此對象的函數(shù)的 原型對象.

JavaScript中的原型是什么

你可以在谷歌和火狐開發(fā)者調(diào)試工具中查看該屬性(__proto__) , 根據(jù)下面的示例:

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

正如上面例子看到, 函數(shù)通過 [[函數(shù)名稱]].prototype 方式訪問到原型對象. 但是, 對象(實(shí)例)并沒有暴露出 prototype  屬性,而是使用 __proto__ 來訪問它.

Object 對象的原型

前面提及到, 原型對象在對象中是不可見. 使用 Object.getPrototypeOf(obj) 方法來訪問實(shí)例的原型對象. (這也是推薦方式,  __proto__ 并不是標(biāo)準(zhǔn)屬性, 在IE11以下其它瀏覽器中沒有實(shí)現(xiàn)).

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)建該實(shí)例的構(gòu)造函數(shù)__proto__指向創(chuàng)建該實(shí)例的構(gòu)造函數(shù)的原型對象.方法描述hasOwnProperty()返回一個(gè)布爾值,指示對象是否包含指定的屬性作為該對象的直接屬性,而不是通過原型鏈繼承。isPrototypeOf()返回一個(gè)布爾值,指示指定的對象是否位于調(diào)用此方法的對象的原型鏈中。propertyIsEnumerable()返回一個(gè)布爾值,該布爾值指示指定的屬性是否可枚舉。toLocaleString()返回本地格式的字符串.toString()返回對象字符串形式.valueOf()返回指定對象的原始值.

Chrome 和 Firfox 將對象的原型表示為 __proto__, 而內(nèi)部引用為 [[Prototype]].  IE不支持,只有IE11包含它.

修改原型

如上所述, 每個(gè)對象都能鏈接到函數(shù)的原型對象. 如果您更改了函數(shù)的原型, 則只有新對象將鏈接到更改后的原型. 所有其他現(xiàn)有對象仍然鏈接到舊的函數(shù)原型.  下面實(shí)例來演示這個(gè)場景:

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中實(shí)現(xiàn)繼承

function Student() {  this.name = 'LeBron James';  this.gender = 'M';  }  Student.prototype.sayHi = function(){  alert("Hi");  };  var studObj = new Student();  studObj.toString();

在上面的示例, toString() 方法在 Student 中沒有定義, 那么它是如何以及從哪里找到 toString() 的呢?

在這里,原型出現(xiàn)了. 首先, JavaScript 引擎檢查 studObj 是否存在 toString 方法?. 如果沒有找到,那么它使用  studObj 的 __proto__ 鏈接指向 Student函數(shù) 的 原型對象. 如果它仍然無法找到它那么它會在往上層并檢查 Object  函數(shù)的原型對象,因?yàn)樗袑ο蠖际菑?JavaScript 中的 Object 派生的,并查找 toString() 方法. 因此,  它在Object函數(shù)的原型對象中找到 toString()方法,因此我們可以調(diào)用 studObj.toString().

查找方式,如下圖所示

JavaScript中的原型是什么

到此,相信大家對“JavaScript中的原型是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI