一日客語:中文:青色 客語:搶厶ㄟ ˋ
繼續學習原型吧~
學習內容:
1.Object.getPrototypeOf() =>等於__proto__
、[[prototype]]
2.Object.getPrototypeOf(實例).constructor
3.利用Object.getPrototypeOf(實例).constructor 方式建立物件
4.改掉原型
現在創了一個 constructor Cat 然後new 出一個實例 nini,可以透過Object.getPrototypeOf()
語法去查找到,除了定義的 sleep 屬性以外還有一個內建屬性叫 constructor指向 Cat 所以Object.getPrototypeOf(nini).constructor
才能印出Cat
function Cat() {
this.eat = () => 'apple';
}
const nini = new Cat();
Cat.prototype.sleep = 'sleep';
console.log(nini);
//Cat { eat: [Function (anonymous)] }
console.log(Object.getPrototypeOf(nini));
//{sleep: 'sleep', constructor: Cat}
console.log(Object.getPrototypeOf(nini).constructor); //[Function: Cat]
若是把 Cat 的原型重新賦值新的物件,原本已經創建的nini還取得到 sleep 嗎
新創的 niki 取得到 sleep 嗎?
繼續看下去吧
function Cat() {
this.eat = () => 'apple';
}
const nini = new Cat();
Cat.prototype.sleep = 'sleep';
console.log(Object.getPrototypeOf(nini)); //{ sleep: 'sleep' }
//原型變動
//新物件改掉Cat原型
Cat.prototype = {
go: function () {
return 'go';
},
};
const niki = new Cat();
console.log(Object.getPrototypeOf(niki)); //{ go: [Function: go] }
Object.getPrototypeOf(niki).constructor//Object
答案:新物件改掉 Cat 原型,nini 仍然可以使用 sleep 方法但 niki 參照的原型已經改變所以無法取用 sleep 屬性
console.log(nini.sleep);//sleep
console.log(niki.go()); //go
console.log(niki.sleep); //undefined
用圖型看看
新物件(niki)會參照到新原型
在原型變動之前創造出來的物件(nini)仍然可以參照到那時的原型
修改了Cat原型後使用Object.getPrototypeOf(niki).constructor
為何是印出 Object 呢
一開始 Object.getPrototypeOf(nini).constructor
明明是Cat為何原型有這種差異呢~~
難道原型鏈結構產生變化?!明天讓我用instanceof來解釋這些關係
function Cat() {
this.eat = () => 'apple';
}
const nini = new Cat();
Cat.prototype.sleep = 'sleep';
console.log(Object.getPrototypeOf(nini)); //{ sleep: 'sleep' }
//原型變動
//新物件改掉Cat原型
Cat.prototype = {
go: function () {
return 'go';
},
};
const niki = new Cat();
console.log(Object.getPrototypeOf(niki)); //{ go: [Function: go] }
Object.getPrototypeOf(niki).constructor//Object
資料參考:
忍者開發技巧探秘第二版