摘要:請看下方的例子我們可以看一下構(gòu)造函數(shù)的原型對象再來看一下的原型對象指針指向的對象所以在修改了原型對象之后,只有在修改之后生成的實例對象上會有新的屬性和方法,之前的實例對象指向的仍然是之前的原型對象。
引出問題
function Person(name, age) {} // Person構(gòu)造函數(shù)是個空函數(shù),將默認值都放在原型對象中 Person.prototype.name = "xiaoming" Person.prototype.age = 20 Person.prototype.sayHi = function() { console.log(`hi, ${this.name}`) } const p1 = new Person() /* 實例對象的內(nèi)部指針指向的是構(gòu)造函數(shù)的原型對象 構(gòu)造函數(shù)的prototype屬性指向的也是這個原型對象 實例對象和構(gòu)造函數(shù)之間沒有直接的聯(lián)系 */ console.log(p1.__proto__ === Person.prototype) //true console.log(Person.prototype.constructor) /* ? Person(name, age) { this.name = name this.age = age this.sayHi = function() { console.log(`hi, ${this.name}`) } 構(gòu)造函數(shù)的原型對象中的constructor指向的是構(gòu)造函數(shù) } */ // 嘗試重寫Person構(gòu)造函數(shù)的原型對象 Person.prototype = { name: "alice", age: 12, sayLove: function() { console.log(`i love ${this.name}`) } } console.log(Person.prototype.constructor) // ? Object() { [native code] }
重寫了 prototype 之后發(fā)現(xiàn)它的constructor不再指向 Person,而是指向了Object構(gòu)造函數(shù)
why ?
明確一點,在調(diào)用構(gòu)造函數(shù)的時候,會為生成的新的實例對象添加一個指針指向構(gòu)造函數(shù)的原型對象
那么在重寫prototype的時候我們用對象字面量的方式創(chuàng)建了一個新的對象,而用這種方式創(chuàng)建就相當于調(diào)用了Object構(gòu)造函數(shù)
不信可以試試
const o1 = {} const o2 = new Object() console.log(o1.__proto__ === o2.__proto__) // true
此時,在調(diào)用了Object構(gòu)造函數(shù)創(chuàng)建一個新對象,并將這個新對象作為 Person 的 prototype 之后,
發(fā)現(xiàn)這個原型對象里面少了一個constructor屬性;
當在一個實例對象中找不到該屬性時,就會去這個實例對象的構(gòu)造函數(shù)的原型對象中尋找,
這個原型對象的構(gòu)造函數(shù)是 Object,所以就會去 Object構(gòu)造函數(shù)的原型對象中尋找,
而我們前面說了,構(gòu)造函數(shù)的原型對象中的constructor指向的是構(gòu)造函數(shù),
所以O(shè)bject的原型對象中的constructor指向的還是Object,
那么如何避免這種情況呢?
如果constructor真的很重要,那么在重寫原型對象的時候可以在對象中加上constructor屬性,
這樣的話就不會去新對象的原型對象中查找constructor屬性了
Person.prototype = { constructor: Person, // 注意這個值不是字符串 name: "alice", age: 12, sayLove: function() { console.log(`i love ${this.name}`) } } console.log(Person.prototype.constructor) /* ? Person(name, age) { this.name = name this.age = age this.sayHi = function() { console.log(`hi, ${this.name}`) } } */
仍然需要注意的是,在修改了構(gòu)造函數(shù)的原型對象之后,即使給原型對象添加了constructor屬性,但是之前通過構(gòu)造函數(shù)生成的實例對象不會自動更新它們的原型對象的指針。請看下方的例子:
//我們可以看一下Person構(gòu)造函數(shù)的原型對象 console.log(Person.prototype) // {name: "alice", age: 12, sayLove: ?, constructor: ?} //再來看一下p1的原型對象指針指向的對象 console.log(p1.__proto__) // {name: "xiaoming", age: 20, sayHi: ?, constructor: ?}
所以在修改了原型對象之后,只有在修改之后生成的實例對象上會有新的屬性和方法,之前的實例對象指向的仍然是之前的原型對象。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/99665.html
摘要:我們知道,調(diào)用構(gòu)造函數(shù)時會為實例添加一個指向最初原型的指針,而把原型修改為另外一個對象就等于切斷了構(gòu)造函數(shù)與最初原型之間的聯(lián)系。 我們知道,調(diào)用構(gòu)造函數(shù)時會為實例添加一個指向最初原型的指針,而把原型修改為另外一個對象就等于切斷了構(gòu)造函數(shù)與最初原型之間的聯(lián)系。 怎么理解這句話,下面我們通過實例來解釋下,如有不對,請指正,虛心受教。 function Person(){ } ...
摘要:原型對象的共享特性,可以很方便的為一些內(nèi)置的對象擴展一些方法,比如,數(shù)組去重復但是,不要隨便往內(nèi)置的對象上面擴展方法,在多人協(xié)作開發(fā),很容易產(chǎn)生覆蓋,以及污染 我們先來一個簡單的構(gòu)造函數(shù)+原型對象的小程序 1 function CreateObj( uName, uAge ) { 2 this.userName = uName; 3 ...
摘要:先來說其實構(gòu)造函數(shù)也有,原型對象有,實例有也有,或者更加籠統(tǒng)的說,所有對象都是有的。構(gòu)造函數(shù)的原型對象上的會指向構(gòu)造函數(shù)。由于屬性是可以變更的,所以未必真的指向?qū)ο蟮臉?gòu)造函數(shù),只是一個提示。 續(xù)上一集內(nèi)容,通過構(gòu)造函數(shù)的方式,成功地更新了生產(chǎn)技術(shù),老板笑呵呵,工人少奔波,只是問題總比辦法多,又遇到一個新問題,就是會造成一些資源的重復和浪費,那么經(jīng)過工程師們的智慧交流,他們產(chǎn)生了一個新技...
摘要:中創(chuàng)建對象的方式有很多,尤其是基于原型的方式創(chuàng)建對象,是理解基于原型繼承的基礎(chǔ)。該函數(shù)中的屬性指向該源性對象當通過該函數(shù)的構(gòu)造函數(shù)創(chuàng)建一個具體對象時,在這個對象中,就會有一個屬性指向原型。 js中創(chuàng)建對象的方式有很多,尤其是基于原型的方式創(chuàng)建對象,是理解基于原型繼承的基礎(chǔ)。因此在這里匯總一下,并對各種方法的利弊進行總結(jié)和對比,不至于以后對這些概念有模糊。 簡單方式創(chuàng)建 var o = ...
摘要:創(chuàng)建實例的方式有三種對象字面量表示法操作符跟構(gòu)造函數(shù)中的函數(shù)。下面主要講的是最為復雜的操作符跟構(gòu)造函數(shù)的創(chuàng)建對象實例的方法。 創(chuàng)建對象 一.創(chuàng)建對象的方法 理解原型對象: 無論什么時候,只要創(chuàng)建了新函數(shù),就會根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個 prototype屬性,這個屬性指向函數(shù)的原型對象。在默認情況下,所有原型對象都會自動獲得一個constructor屬性,這個屬性包含一個指向p...
閱讀 630·2021-09-24 09:48
閱讀 2492·2021-08-26 14:14
閱讀 518·2019-08-30 13:08
閱讀 1445·2019-08-29 15:22
閱讀 3067·2019-08-29 11:06
閱讀 1001·2019-08-26 18:26
閱讀 1036·2019-08-26 13:53
閱讀 2514·2019-08-26 12:21