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