鍍金池/ 問答/Java  網(wǎng)絡(luò)安全  HTML/ js 構(gòu)造函數(shù)生成實(shí)例對(duì)象的疑問

js 構(gòu)造函數(shù)生成實(shí)例對(duì)象的疑問

本人js新手, 最近在學(xué)習(xí)對(duì)象的內(nèi)容的時(shí)候遇到了一點(diǎn)小疑問, 如下:

個(gè)人理解: 每次使用new命令生成實(shí)例對(duì)象以后, 所有構(gòu)造函數(shù)里面的屬性都會(huì)被定義在實(shí)例對(duì)象上, 也就是說(shuō)任何兩個(gè)實(shí)例對(duì)象上, 里面的屬性都是不一樣的無(wú)法共享, 但是如果那個(gè)屬性不是方法, 其似乎還是'一樣的', 看代碼:

var Cat = function() {
    this.color = 'red'
    this.say = function() {
        console.log('miao')
    }
}
var c1 = new Cat()
var c2 = new Cat()

console.log(c1.color === c2.color) // true
console.log(c1.say === c2.say) // false

對(duì)于say這個(gè)方法是因?yàn)閮蓚€(gè)實(shí)例對(duì)象方法都是不一樣, 這也是為什么要用prototype來(lái)興義方法, 但是為什么color這個(gè)屬性顯示結(jié)果為true? 同樣作為屬性兩個(gè)實(shí)例對(duì)象在生成的時(shí)候應(yīng)該是不同的, 但是結(jié)果為什么是true?不是特別理解

希望能有前輩給予解答, 謝謝!

回答
編輯回答
喜歡你

C

var Cat = function() {
    this.color = {}; 
    this.say = function() {
        console.log('miao')
    }
}
var c1 = new Cat()
var c2 = new Cat()

P

console.log(c1.color === c2.color); 
console.log({} === {}); 
console.log(123 === 123); 

S

clipboard.png

2017年1月11日 23:29
編輯回答
你好胸

根據(jù)我的理解函數(shù)比較的是在內(nèi)存中的指針,而基本類型僅僅比較值。

2017年12月14日 21:51
編輯回答
熊出沒

樓上說(shuō)的沒錯(cuò),基本類型的比較只比個(gè)值,另外字符串在js中是常量,相同值的常量會(huì)不會(huì)只存儲(chǔ)一份我不是特別清楚,我想說(shuō)的是,如果兩個(gè)變量引用了值相等的兩個(gè)字符串,那這兩個(gè)字符串可能確實(shí)是同一個(gè)字符串,他們占用的是同一個(gè)存儲(chǔ)空間。

用函數(shù)來(lái)構(gòu)造對(duì)象,并在構(gòu)造函數(shù)里動(dòng)態(tài)添加類方法,每次執(zhí)行構(gòu)造函數(shù)都會(huì)生成匿名函數(shù)作為類方法,所以每次new出來(lái)的對(duì)象的同名的方法其實(shí)都是占用不同內(nèi)存空間的匿名函數(shù),用==比較它們時(shí),比較的其實(shí)是它們的地址,或者說(shuō)“是否是同一個(gè)對(duì)象”。而字符串,數(shù)字這些基本類型的數(shù)據(jù),用==比較時(shí),比較的是它們的值,否則你要怎么判斷兩個(gè)數(shù)字相等?

2017年3月11日 01:49