(1) function person(){ this.name = 'Tom'; } (2) function person(){} person.name = 'Tom'; (3) function person(){} person.prototype.name = 'Tom'
1是公有屬性
2是靜態屬性
3是原型共享屬性
解釋1:
因為 JS 里, 函數也是對象, 是 Function 的實例。
function person(){ this.name = 'Tom'; }
這時候一般把 person 當作構造函數。
const demo = new person()
name 屬性是掛在 new 生成對象, 也就是 demo 上的。
ps: 當然, 你也可以不用 new 調用 person。但是可能會發生不可預知的后果。
function person(){} person.name = 'Tom';
這是在函數對象上直接定義了 name 屬性。
function person(){} person.prototype.name = 'Tom'
每個函數都會有一個 prototype 的屬性(箭頭函數除外)。 name 是放到原型屬性上。
每個用 new 調用生成的對象,都可以訪問到它們構造函數原型上的 name 屬性。
解釋2:
因為Js里面函數也是對象。
函數其實也有另一個寫法就是
a = new Function("return 1");
函數也是new出來的,所以函數其實也是一個對象。所以對象可以添加屬性。