鍍金池/ 問答/Java  網絡安全  HTML/ js 構造函數生成實例對象的疑問

js 構造函數生成實例對象的疑問

本人js新手, 最近在學習對象的內容的時候遇到了一點小疑問, 如下:

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

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

對于say這個方法是因為兩個實例對象方法都是不一樣, 這也是為什么要用prototype來興義方法, 但是為什么color這個屬性顯示結果為true? 同樣作為屬性兩個實例對象在生成的時候應該是不同的, 但是結果為什么是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
編輯回答
你好胸

根據我的理解函數比較的是在內存中的指針,而基本類型僅僅比較值。

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

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

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

2017年3月11日 01:49