而 Object 物件含有 prototype 這個屬性(Property) 。
var myObject = {} // 等同於 var myObject = new Object()沒用到 prototype 時,每個實體(killerRabbit 和 cuteRabbit) 都擁有各自的 name 屬性,
卻沒有共同的屬性:
function Rabbit(name) { this.name = name } var killerRabbit = new Rabbit("killer"); var cuteRabbit = new Rabbit("cute");
所以如果這兩隻兔子想要共用屬性時,prototype 就可以派上用場:
function Rabbit(name) { this.name = name } Rabbit.prototype.printName = function(){ print('My name is: ', this.name) };
由於 Rabbit 有 prototype,Object 又有 prototype,那尋訪的順序是? 看看下面的例子:
Object.prototype.teeth = "normal"; function Rabbit() { this.teeth = 'big' } Rabbit.prototype.teeth = "small"; var killerRabbit = new Rabbit("killer"); print(Rabbit.prototype.teeth) // small print(Rabbit.teeth) // normal print(killerRabbit.teeth) // big print(killerRabbit.prototype.teeth) // Exception: TypeError: Cannot read property 'teeth' of undefined當查看一個物件的屬性時,JavaScript 會:
- 先看該物件實體(this) 有無該屬性。
- 在看該物件的 prototype 物件有無該屬性。
- 最後看 Object 物件的 prototype 物件有無該屬性,沒有的話則給予 undefined。