摘要:而這個原型對象作為這個構(gòu)造函數(shù)的一個屬性,是被其創(chuàng)建出來的所有實例共享的。
構(gòu)造函數(shù)創(chuàng)建對象帶來的問題
上一篇文章介紹了JavaScript創(chuàng)建對象的幾種方法,都有各自的優(yōu)缺點。
構(gòu)造函數(shù)看起來好像很好,但是它也有一個問題,那就是創(chuàng)建出來的每一個實例對象的方法都是一個獨立的函數(shù),即使他們的內(nèi)容是完全相同的,這是不符合函數(shù)的代碼復(fù)用原則的,而且也不能夠統(tǒng)一的修改已被創(chuàng)建的實例的方法。
function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; this.introduce = function () { console.log("我叫" + this.name + ", 今年" + this.age + "歲."); }; } var jerry = new Person("Jerry", "21", "M"); var julia = new Person("Julia", "27", "F"); console.log(jerry.introduce === julia.introduce); // false
上述代碼中的jerry對象和julia對象的introduce()方法是兩個獨立的函數(shù),數(shù)據(jù)不共享,如果對象創(chuàng)建更多就浪費了大量的內(nèi)存空間。
JavaScript原型解決方案在 JavaScript 中,每當定義一個對象(函數(shù)也是對象)時候,對象中都會包含一些預(yù)定義的屬性。其中每個函數(shù)對象都有一個 prototype 屬性,這個屬性指向函數(shù)的原型對象。
那么,這個原型對象有什么作用呢?
構(gòu)造函數(shù)是一個函數(shù)對象,所以就會有一個 prototype 屬性,也就有了一個原型對象,既然這是一個對象,那么久可以為它添加屬性和方法。而這個原型對象作為這個構(gòu)造函數(shù)的一個屬性,是被其創(chuàng)建出來的所有實例共享的。
所以上面的代碼我們可以這樣改寫
function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; } Person.prototype.introduce = function () { console.log("我叫" + this.name + ", 今年" + this.age + "歲."); }; var jerry = new Person("Jerry", "21", "M"); var julia = new Person("Julia", "27", "F"); console.log(jerry.introduce === julia.introduce); // true
這樣就解決了數(shù)據(jù)共享的問題,達到了代碼復(fù)用的目的,無論通過此構(gòu)造函數(shù)創(chuàng)建了多少個對象,introduce 方法只會占用一份內(nèi)存空間。
且可以統(tǒng)一修改所有 Person 構(gòu)造函數(shù)創(chuàng)建的實例對象的 introduce 方法。
function Dog(name, age) { this.name = name; this.age = age; } Dog.prototype.play = function () { console.log("小狗玩耍"); this.bark(); }; Dog.prototype.bark = function () { console.log("小狗叫"); }; var tom = new Dog("Tom", 3); tom.play();// 小狗玩耍 小狗叫
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94196.html
摘要:首先,需要來理清一些基礎(chǔ)的計算機編程概念編程哲學(xué)與設(shè)計模式計算機編程理念源自于對現(xiàn)實抽象的哲學(xué)思考,面向?qū)ο缶幊淌瞧湟环N思維方式,與它并駕齊驅(qū)的是另外兩種思路過程式和函數(shù)式編程。 JavaScript 中的原型機制一直以來都被眾多開發(fā)者(包括本人)低估甚至忽視了,這是因為絕大多數(shù)人沒有想要深刻理解這個機制的內(nèi)涵,以及越來越多的開發(fā)者缺乏計算機編程相關(guān)的基礎(chǔ)知識。對于這樣的開發(fā)者來說 J...
摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個繼承層級,而實線表示屬性引用。原型鏈是實現(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個問題,在面試中,很多同學(xué)經(jīng)常都會遇到。這里給大家講講,方便大家記憶。 JavaScript的特點JavaScript是一門直譯式腳本...
摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個繼承層級,而實線表示屬性引用。原型鏈是實現(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個問題,在面試中,很多同學(xué)經(jīng)常都會遇到。這里給大家講講,方便大家記憶。 JavaScript的特點JavaScript是一門直譯式腳本...
摘要:如下所示在規(guī)范中,已經(jīng)正式把屬性添加到規(guī)范中也可以通過設(shè)置和獲取對象的原型對象對象之間的關(guān)系可以用下圖來表示但規(guī)范主要介紹了如何利用構(gòu)造函數(shù)去構(gòu)建原型關(guān)系。 前言 在軟件工程中,代碼重用的模式極為重要,因為他們可以顯著地減少軟件開發(fā)的成本。在那些主流的基于類的語言(比如Java,C++)中都是通過繼承(extend)來實現(xiàn)代碼復(fù)用,同時類繼承引入了一套類型規(guī)范。而JavaScript是...
摘要:在最開始的時候,原型對象的設(shè)計主要是為了獲取對象的構(gòu)造函數(shù)。同理數(shù)組通過調(diào)用函數(shù)通過調(diào)用原型鏈中描述了原型鏈的概念,并將原型鏈作為實現(xiàn)繼承的主要方法。 對象的創(chuàng)建 在JavaScript中創(chuàng)建一個對象有三種方式??梢酝ㄟ^對象直接量、關(guān)鍵字new和Object.create()函數(shù)來創(chuàng)建對象。 1. 對象直接量 創(chuàng)建對象最直接的方式就是在JavaScript代碼中使用對象直接量。在ES5...
摘要:并沒有類繼承模型,而是使用原型對象進行原型式繼承。我們舉例說明原型鏈查找機制當訪問一個對象的屬性時,會從對象本身開始往上遍歷整個原型鏈,直到找到對應(yīng)屬性為止。原始類型有以下五種型。此外,試圖查找一個不存在屬性時將會遍歷整個原型鏈。 Javascript 并沒有類繼承模型,而是使用原型對象 prototype 進行原型式繼承。 盡管人們經(jīng)常將此看做是 Javascript 的一個缺點,然...
閱讀 2855·2023-04-25 17:59
閱讀 685·2023-04-25 15:05
閱讀 675·2021-11-25 09:43
閱讀 3038·2021-10-12 10:13
閱讀 3545·2021-09-27 13:59
閱讀 3589·2021-09-23 11:21
閱讀 3889·2021-09-08 09:35
閱讀 571·2019-08-29 17:12