搜尋
首頁web前端js教程基於JavaScript實作繼承機制之原型鏈(prototype chaining)的詳解_javascript技巧

如果用原型方式重定義前面範例中的類,它們將變成下列形式:

複製程式碼 程式碼如下:

function ClassA() {
}

ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB() {
}

ClassB.prototype = new ClassA();


原型方式的神奇之處在於最後一行程式碼。這裡,把 ClassB 的 prototype 屬性設定成 ClassA 的實例。這很有意思,因為想要 ClassA 的所有屬性和方法,但又不想逐一將它們 新增到ClassB 的 prototype 屬性。還有比把 ClassA 的實例賦予 prototype 屬性更好的方法嗎?

注意:呼叫 ClassA 的建構函數,沒有給它一個參數。這在原型鏈中是標準做法。要確保建構函數沒有任何參數。

與物件冒充相似,子類別的所有屬性和方法都必須出現在 prototype 屬性被賦值後,因為在它之前賦值的所有方法都會被刪除。為什麼?因為 prototype 屬性被替換成了新對象,所以添加了新方法的原始物件將被銷毀。所以,為ClassB 類別加入name 屬性和sayName() 方法的程式碼如下:

複製程式碼 程式碼如下:


程式碼如下:

程式碼如下:


function ClassB() {
}


ClassB.prototype = new ClassA();
ClassB.prototype.name = "";ClassB.prototype.sayName = function () {    alert(this.name);};可透過執行下面的範例來測試這段程式碼:



複製程式碼


程式碼如下:


var objA = new ClassA();
var objB = new ClassB();
objA.color = "blue";
objB.color = "red";
objB.name = "John"; objA.sayColor();objB.sayColor();objB.sayName();此外,在原型鏈中,instanceof 運算子的運作方式也很獨特。對於 ClassB 的所有實例,instanceof 為 ClassA 和 ClassB 都會傳回 true。例如:



複製程式碼

程式碼如下:
var objB = new ClassB(); >alert(objB instanceof ClassA);    //輸出"true"alert(objB instanceof ClassB);    //輸出"true"類型在ECMAScript 的「true"
類型在ECMAScript 的世界中,這是極弱。有用的工具,不過使用物件冒充時不能使用該方法判斷。但由於子類別的原型直接重新賦值,所以出現以下這種情況:



複製程式碼 程式碼如下: console.log(objB.__proto__===objB.constructor.prototype)   //false因為ClassB的原型鏈prototype 屬性被另一個類別的物件重寫了。輸出結果可以看出objB.__proto__仍然指向的是ClassB.prototype,而不是objB.constructor.prototype。這也很好理解,給Person.prototype賦值的是一個物件直接量new ClassA()實例,使用物件直接量方式定義的物件其建構器(constructor)指向的是根構造器Object,Object.prototype是一個空物件{},{}自然與ClassB.prototype不等。
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
什么是原型和原型链什么是原型和原型链Nov 09, 2023 pm 05:59 PM

原型,js中的一个对象,用于定义其他对象的属性和方法,每个构造函数都有一个prototype属性,这个属性是一个指针,指向一个原型对象,当创建新对象时,这个新对象会从其构造函数的prototype属性继承属性和方法。原型链,当试图访问一个对象的属性时,js会首先检查这个对象是否有这个属性,如果没有,那么js会转向这个对象的原型,如果原型对象也没有这个属性,会继续查找原型的原型。

什么作用域链和原型链什么作用域链和原型链Nov 13, 2023 pm 01:46 PM

作用域链和原型链是JavaScript中两个重要的概念,分别对应着作用域和继承两个核心特性:1、作用域链是JavaScript中用来管理变量访问和作用域的机制,其形成是由函数创建时所处的执行上下文环境和词法作用域决定的;2、原型链是JavaScript中实现继承的机制,基于对象之间的原型关系,当访问对象的属性或方法时,如果该对象本身没有定义,会沿着原型链向上查找。

原型和原型链有什么区别原型和原型链有什么区别Nov 09, 2023 pm 04:48 PM

原型和原型链的区别是:1、原型是每个对象都具有的属性,包含了一些共享的属性和方法,用于实现对象之间的属性和方法的共享和继承,而原型链是一种通过对象之间的原型关系来实现继承的机制,定义了对象之间的继承关系,使得对象可以共享原型对象的属性和方法;2、原型的作用是定义对象的共享属性和方法,使得多个对象可以共享同一个原型对象的属性和方法,而原型链的作用是实现对象之间的继承关系等等。

原型和原型链的存在意义是什么?原型和原型链的存在意义是什么?Jan 13, 2024 pm 12:58 PM

原型和原型链存在的原因是为了实现JavaScript语言中的继承和对象属性的共享。在JavaScript中,一切皆为对象,包括函数。每个对象都有一个属性,称为原型(prototype),它指向另一个对象,该对象被称为原型对象。对象可以从原型对象中继承属性和方法。通过原型实现共享属性和方法的好处是节省内存。考虑一个对象A,它有一些属性和方法,然后创建对象B并使

js原型和原型链有什么作用js原型和原型链有什么作用Nov 09, 2023 pm 04:56 PM

js原型和原型链的作用是实现对象的继承,节省内存空间,并提高代码的性能和可维护性。详细介绍:1、实现对象的继承,原型和原型链允许创建一个对象,并使其继承另一个对象的属性和方法,当创建一个新的对象时,可以将其原型指向另一个对象,这样新对象就可以访问到原型对象上的属性和方法;2、节省内存和提高性能,在JavaScript中,每个对象都有一个原型,通过原型链,对象可以共享原型上等等。

es6中什么是原型链es6中什么是原型链Nov 15, 2022 pm 07:28 PM

原型链,简单理解就是原型组成的链。当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,被称为原型链。

探索原型和原型链的特殊性探索原型和原型链的特殊性Jan 13, 2024 pm 03:50 PM

原型和原型链的独特之处探究在JavaScript中,原型(prototype)和原型链(prototypechain)是非常重要的概念。理解原型和原型链的独特之处可以帮助我们更好地理解JavaScript中的继承和对象创建。原型是JavaScript中每个对象都拥有的一个属性,它指向一个其他对象,用于共享属性和方法。每个JavaScript对象都有一个原型

js原型和原型链是什么js原型和原型链是什么Jun 14, 2023 am 11:34 AM

js原型和原型链是:1、原型,所有的函数默认都有一个“prototype”这样公有且不可枚举的属性,它会指向另一个对象,这个对象就是原型。2、原型链,当访问对象的属性或方法时,首先对象会从自身去找,找不到就会往原型中去找,也就是它构造函数的“prototype”中,如果原型中找不到,即构造函数中也没有该属性,就会往原型后面的原型上去找,这样就形成了链式的结构,称为原型链。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中