搜尋
首頁web前端js教程基於JavaScript實作繼承機制之建構函數 原型鏈混合方式的使用詳解_javascript技巧

建構子、原型實作繼承的缺陷

首先來分析建構子和原型鏈兩種實作繼承方式的缺陷:

建構函式(物件冒充)的主要問題是必須使用建構函式方式,且無法繼承透過原型定義的方法,這不是最好的選擇。不過如果使用原型鏈,就無法使用帶有參數的建構函數了。開發者如何選擇?答案很簡單,兩者都用。

建構子 原型混合方式

這種繼承方式使用建構函式定義類,並非使用任何原型。創建類別的最好方式是用建構函數定義屬性,用原型定義方法。這種方式同樣適用於繼承機制,用物件冒充繼承建構函式的屬性,用原型鏈繼承 prototype 物件的方法。用這兩種方式重寫前面的例子,程式碼如下:

複製程式碼 程式碼如下:

function ClassA(sColor) {
    this.color = sColor;
}

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

function ClassB(sColor, sName) {
    ClassA.call(this, sColor);
    this.name = sName;
}

ClassB.prototype = new ClassA();

ClassB.prototype.sayName = function () {
    alert(this.name);
};


在此例子中,繼承機制由兩行突出顯示的藍色代碼實現。在第一行反白的程式碼中,在 ClassB 建構函式中,用物件冒充繼承 ClassA 類別的 sColor 屬性。在第二行反白的程式碼中,用原型鏈繼承 ClassA 類別的方法。由於這種混合方式使用了原型鏈,所以 instanceof 運算子仍能正確運作。

下面的範例測試了這段程式碼:
複製程式碼


程式碼如下:


var objA = new ClassA("blue");
var objB = new ClassB("red", "John");
objA.sayColor();    //輸出"blue"
objB.sayColor();    //輸出"red"objB.sayName();    //輸出"John"
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python中的构造函数Python中的构造函数Sep 02, 2023 pm 04:29 PM

在Python中,每个类都有一个构造函数,它是类内部指定的特殊方法。构造函数/初始化程序将在为类创建新对象时自动调用。当对象被初始化时,构造函数将值分配给类中的数据成员。没有必要显式定义构造函数。但为了创建构造函数,我们需要遵循以下规则-对于一个类,它只允许有一个构造函数。构造函数名称必须是__init__。必须使用实例属性定义构造函数(只需将self关键字指定为第一个参数)。它不能返回除None之外的任何值。语法classA():def__init__(self):pass示例考虑下面的示例并

C++语法错误:定义在类外的构造函数必须加上类名作为限定符,应该怎么改正?C++语法错误:定义在类外的构造函数必须加上类名作为限定符,应该怎么改正?Aug 22, 2023 pm 02:00 PM

C++是一种广泛使用的面向对象编程语言,C++中定义类的构造函数时,如果希望将构造函数的定义放在类外部,那么就需要在构造函数的定义中加上类名作为限定符,以指定这个构造函数是属于哪个类的。这是C++语法的一条基本规定。如果在定义类的构造函数时没有遵守这个规定,就会出现编译错误,提示“定义在类外的构造函数必须加上类名作为限定符”。那么,如果碰到这种编译错误,应该

什么是构造函数?详解JavaScript中的构造函数什么是构造函数?详解JavaScript中的构造函数Aug 04, 2022 pm 03:22 PM

作为原型和原型链的基础,先了解清楚构造函数以及它的执行过程才能更好地帮助我们学习原型和原型链的知识。本篇文章带大家详细了解一下JavaScript中的构造函数,介绍一下怎么利用构造函数创建一个js对象,希望对大家有所帮助!

go语言有构造函数吗go语言有构造函数吗Jan 10, 2023 pm 02:15 PM

go语言没有构造函数。go语言作为结构化的语言是没有面向对象语言中的构造方法的,不过可以通过一些方式实现类似的面向对象语言中构造方法的效果,也就是使用结构体初始化的过程来模拟实现构造函数。

C++报错:构造函数必须在public区域声明,怎么处理?C++报错:构造函数必须在public区域声明,怎么处理?Aug 21, 2023 pm 08:26 PM

在C++编程中,构造函数是用来初始化类的成员变量的重要函数。它在创建对象时自动调用,以确保对象的正确初始化。构造函数必须在类中声明,但是有时会遇到错误提示“构造函数必须在public区域声明”。这个错误通常是因为构造函数的访问权限修饰符错误引起的。在C++中,类的成员变量和成员函数都有一个访问权限修饰符,包括public、private和protected。

聊聊JavaScript中怎么利用Object()函数创建对象聊聊JavaScript中怎么利用Object()函数创建对象Aug 04, 2022 pm 04:32 PM

怎么利用Object()函数创建对象?下面本篇文章给大家介绍一下Object()构造函数创建对象的方法(附其他三种创建对象的方法),希望对大家有所帮助!

C++语法错误:只有单一参数的构造函数必须声明为explicit,要怎样解决?C++语法错误:只有单一参数的构造函数必须声明为explicit,要怎样解决?Aug 22, 2023 am 09:01 AM

在C++编程中,可能会遇到如下错误提示:只有单一参数的构造函数必须声明为explicit。这个错误提示可能让初学者感到疑惑,接下来,我们来了解一下在C++中什么是explicit,以及该错误提示出现的原因以及如何解决这一问题。explicit的作用在C++中,如果我们定义了一个只接收一个参数的构造函数,那么我们需要使用关键字explici

为什么在Java中构造函数不能是final的?为什么在Java中构造函数不能是final的?Aug 20, 2023 pm 07:01 PM

每当你将一个方法声明为final时,你就不能覆盖它。也就是说,你不能为子类提供对超类的final方法的实现。也就是说,将一个方法声明为final的目的是防止从外部(子类)修改该方法。在继承中,当你扩展一个类时,子类会继承超类的所有成员,除了构造函数。换句话说,构造函数不能在Java中被继承,因此你不能覆盖构造函数。因此,在构造函数前面加上final没有意义。因此,Java不允许在构造函数前使用final关键字。如果你尝试将构造函数声明为final,将会产生一个编译时错误,提示“modifierf

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.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

記事本++7.3.1

記事本++7.3.1

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

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能