原型物件 Prototype Object
特性
只有函式物件才擁有公開的原型物件
其他的物件僅有私有的原型物件
代表物件實體的上層物件
所有物件實體會自動繼承原型物件
建立物件之間的鏈結關係
var build = function () {
this.tag = 'ikea';
this.price = 2599;
};
var category = 'clothes';
console.log(build.prototype); // Object {}
console.log(category.prototype); // undefined
// Can use __proto__ in Chrome Browser!
console.log(category.__proto__); // String {}
constructor
預設是建構式函式 (可更改)
var obj = new build();
console.log(obj.tag); // ikea
console.log(obj.price); // 2599
typeof(obj); // 'object'
console.log(obj.prototype); // undefined
// Can use __proto__ in Chrome Browser!
console.log(obj.__proto__); // Object {}
obj.__proto__.constructor // function () { this.tag = 'ikea'; this.price = 2599; }
實作繼承
build.prototype.tag = 'original'; // 設定原型物件屬性, 不建議隨便使用
var obj = new build();
console.log(obj); // obj { tag: 'ikea', price: 2599 }
delete obj.tag; // 刪除 tag 屬性
console.log(obj.tag); // original
prototype 與 constructor
prototype (函式公開屬性) 與 __proto__ (物件內部屬性)
- 設定物件繼承
- 原型鏈結觀念 (prototype chain)
- IE Browser 無法存取 __proto__
constructor
- 跟其他語言的建構子不一樣在於它並不會執行
- 僅僅是個名稱
- 物件的 constructor 屬性僅供參考
prototype chain
- 物件本身擁有的屬性
- 物件內部 __proto__ (繼承自 prototype) 的屬性
- 不斷的往上層物件找下去直到最後遇到 Object 物件為止
var build = function () {
this.url = 'tw.yahoo.com';
};
var y = new build();
console.log(y.url); // tw.yahoo.com
delete y.url; // 刪除 url 屬性
console.log(y.url); // undefined
build.prototype.url = 'www.google.com';
console.log(y.url); // www.google.com
console.log(y.url === y.__proto__.url); // true
y.url = 'www.amazon.com';
console.log(y.url === y.__proto__.url); // false
模擬 prototype chain 查找屬性
console.log(y.__proto__); // Object {}
console.log(y.__proto__.__proto__); // Object {}
console.log(y.__proto__.__proto__.__proto__); // null
console.log(y.url.__proto__); // String {}
console.log(y.url.__proto__.__proto__); // Object {}
console.log(y.url.__proto__.__proto__.proto__); // null
// 根物件 != Object