欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript對象的創(chuàng)建模式與繼承模式示例講解

 更新時間:2022年12月01日 08:51:42   作者:花鐺  
繼承機制是面向對象程序設計使代碼可以復用的最重要的手段,它允許程序員在保持原有的特性基礎上進行擴展,增加功能,這樣產生新的類,稱作是派生類。繼承呈現(xiàn)了面向對象程序設計的層析結構,體現(xiàn)了由簡單到復雜的認知過程。繼承是類設計層次的復用

對象的創(chuàng)建模式

Object 構造函數(shù)模式:先創(chuàng)建空對象,再動態(tài)添加屬性和方法。

適用場景:初始時對象內部數(shù)據(jù)不確定。

存在問題:語句太多(這個問題可以通過使用對象字面量模式來解決)。

var person = new Object()
person.name = 'Tom' 
person.setName = function(name){
      this.name = name
}

使用對象字面量模式:使用 {} 創(chuàng)建對象,同時指定屬性和方法。

適用場景:初始時對象內部數(shù)據(jù)是確定的。

存在問題:如果創(chuàng)建多個對象,有很多重復代碼(這個問題可以通過使用工廠模式來解決)。

var person={
    name:'Tom', 
    setName: function (name){
          this.name = name
    }
}

工廠模式:通過工廠函數(shù)動態(tài)創(chuàng)建對象并返回。

適用場景:需要創(chuàng)建多個對象。

存在問題:對象沒有具體的類型(這個問題可以通過使用自定義構造函數(shù)模式來解決)。

function createPerson(name) {
	var obj = {
		name: name,
		setName: function (name) {
			this.name = name
		}
	}
	return obj 
}
var p1 = createPerson('Tom') 
var p2 = createPerson('Mary') 

自定義構造函數(shù)模式:自定義構造函數(shù),通過 new 創(chuàng)建對象。

適用場景:需要創(chuàng)建多個類型確定的對象。

存在問題:每個對象都有相同的數(shù)據(jù)(方法),浪費內存(這個問題可以通過使用構造函數(shù) + 原型的組合模式來解決)。

function Person(name) {
	this.name = name
	this.setName = function(name) {
		this.name = name
	}
}
var p1 = new Person('Tom')
var p2 = new Person('Mary')

構造函數(shù) + 原型的組合模式:自定義構造函數(shù),屬性在函數(shù)中初始化,方法添加到原型上。

適用場景:需要創(chuàng)建多個類型確定的對象。

function Person(name) {
	this.name = name
}
Person.prototype.setName = function(name) {
	this.name = name
}
var p1 = new Person('Tom')
var p2 = new Person('Mary')

對象的繼承模式

原型鏈繼承:

變量查找作用域鏈;對象的屬性和方法查找原型鏈。

child.toString()

child.__proto__ = Child.prototype ----> Child.prototype = new Object() ----> {}.__proto__ = Object.prptotype child 能夠訪問到 toString 方法:是因為 child 實例能夠訪問到其原型對象上的方法;Child 構造函數(shù)的原型對象又指向 Object 構造函數(shù)的實例;{} 實例能夠訪問到其原型對象上的方法,因此順著原型鏈 child 能夠訪問到 Object 構造函數(shù)原型對象上的方法。

// 父類型
function Parent() {
	this.parentProp = 'parent prop'
}
Parent.prototype.showParent = function() {
	console.log(this.parentProp)
}
// 子類型
function Child() {
	this.childProp = 'child prop'
}
// 讓子類構造函數(shù)的 prototype 指向父類的實例對象,就可以形成子類 --- 父類的一條原型鏈,子類就可以訪問到父類原型上的屬性和方法。
Child.prototype = new Parent()
// 如果此時 console.log(child.constructor) 會打印輸出 Parent。
// 默認情況下,所有的原型對象都會自動獲得一個 constructor 屬性,指向原型對象所在的函數(shù)。因此 child 本身是沒有 constructor 屬性的,而是在它的原型對象身上;又因為它的原型對象指向了 Parent 的實例對象;Parent 實例對象的原型對象的 constructor 是 Parent,因此 child.constructor = Parent。這樣是錯誤的。
Child.prototype.constructor = Child
Child.prototype.showChild = function() {
	console.log(this.childProp)
}
var child = new Child()
child.showParent()

借用構造函數(shù)繼承:其實并沒有真的實現(xiàn)繼承,而是在子類構造函數(shù)中通過 call() 調用了父類的構造函數(shù)。

function Parent(name, age) {
	this.name = name
	this.age = age
}
function Child(name, age, price) {
	Parent.call(this, name, age) // 相當于執(zhí)行 this.Person(name, age),也就是相當于 this.name = name; this.age = age
	this.price = price
}
const child = new Child('Tom', 20, 500)
console.log(child.name, child.age, child.price)

組合繼承:利用原型鏈繼承實現(xiàn)對父類型的方法的繼承;借用構造函數(shù)繼承初始化相同的屬性(真正在用的是這種方法)。

call() 是繼承屬性,重寫原型是繼承方法。

function Parent(name, age) {
	this.name = name
	this.age = age
}
Parent.prototype.setName = function(name) {
	this.name = name
}
function Child(name, age, price) {
    // 初始化相同的屬性
	Parent.call(this, name, age) 		
	this.price = price
}
// 繼承父類的原型對象上的方法
Child.prototype = new Parent()
// 修正 constructor 屬性
Child.prototype.constructor = Child
Parent.prototype.setPrice = function(price) {
	this.price = price
}
const child = new Child('Tom', 20, 500)
console.log(child.name, child.age, child.price)

到此這篇關于JavaScript對象的創(chuàng)建模式與繼承模式示例講解的文章就介紹到這了,更多相關JS對象創(chuàng)建模式與繼承模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JavaScript WeakMap使用詳解

    JavaScript WeakMap使用詳解

    這篇文章主要介紹了JavaScript WeakMap使用的詳細介紹,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下
    2021-02-02
  • 一篇文章讓你徹底搞懂js中的位置計算

    一篇文章讓你徹底搞懂js中的位置計算

    js中有各種與位置相關的屬性,每次看到的時候都各種懵逼,索性一次總結一下,這篇文章主要給大家介紹了關于js中位置計算的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • node在兩個div之間移動,用ztree實現(xiàn)

    node在兩個div之間移動,用ztree實現(xiàn)

    本文介紹了“node在兩個div之間移動,用ztree實現(xiàn)”的方法,需要的朋友可以參考一下
    2013-03-03
  • Js判斷參數(shù)(String,Array,Object)是否為undefined或者值為空

    Js判斷參數(shù)(String,Array,Object)是否為undefined或者值為空

    在一些前端控件要提交數(shù)據(jù)到服務器端的數(shù)據(jù)驗證過程中,需要判斷提交的數(shù)據(jù)是否為空。如果是普通表單的字符串數(shù)據(jù),只需要在 trim 后判斷 length 即可,而這里需要的數(shù)據(jù)可以是各種不同的類型,通過 JSON.stringify(data) 進行序列化后再傳遞
    2013-11-11
  • JavaScript之class繼承_動力節(jié)點Java學院整理

    JavaScript之class繼承_動力節(jié)點Java學院整理

    這篇文章主要介紹了JavaScript之class繼承,新的關鍵字class從ES6開始正式被引入到JavaScript中。class的目的就是讓定義類更簡單,有興趣的可以了解一下
    2017-07-07
  • 前端跨域的幾種解決方式總結(推薦)

    前端跨域的幾種解決方式總結(推薦)

    這篇文章主要介紹了前端跨域的幾種解決方式,詳細介紹了同源策略并同時給出了跨域的五種解決方案,具體操作步驟大家可查看下文的詳細講解,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • javascript面向對象包裝類Class封裝類庫剖析

    javascript面向對象包裝類Class封裝類庫剖析

    一個從來沒有接觸過javascript的技術人員,幾小時內就可以寫出一個簡單有用的程序代碼;想寫出高性能的代碼,同樣需要具備一個高級程序員的基本素養(yǎng),javascript也是如此
    2013-01-01
  • JavaScript調試常見報錯及原因分析

    JavaScript調試常見報錯及原因分析

    這篇文章主要介紹了JavaScript調試常見報錯及原因分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • webpack配置的最佳實踐分享

    webpack配置的最佳實踐分享

    在網(wǎng)上看到很多人都寫了“webpack最佳實踐方案”,適合的才是“最佳”的,在這里總結一下自己在工作過程中總結出來的最佳實踐,所以本文主要介紹了關于webpack配置的相關資料,需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • JavaScript用Number方法實現(xiàn)string轉int

    JavaScript用Number方法實現(xiàn)string轉int

    parseInt方法在format'00'開頭的數(shù)字時會當作2進制轉10進制,所以建議string轉int最好用Number方法
    2014-05-05

最新評論