原型链:
const myObject ={
city:"Madrid",
greet(){
console.log(`来自${this.city}的问候`);
},
};
结果展示:
当在控制台输入 myObject.时
,控制台会列出该对象可用的一系列属性:
尝试输入一个myObject.toString();发现可以成功调用:
额外的属性:
①JavaScript 中所有的对象都有一个内置属性,称为它的 prototype(原型)。它本身是一个对象,故原型对象也会有它自己的原型,逐渐构成了原型链。原型链终止于拥有 null
作为其原型的对象上。
②备注: 指向对象原型的属性并不是 prototype
。它的名字不是标准的,但实际上所有浏览器都使用 __proto__。访问对象原型的标准方法是 Object.getPrototypeOf。
③当你试图访问一个对象的属性时:如果在对象本身中找不到该属性,就会在原型中搜索该属性。如果仍然找不到该属性,那么就搜索原型的原型,以此类推,直到找到该属性,或者到达链的末端,在这种情况下,返回 undefined
。
④所以,在调用 myObject.toString()
时,浏览器做了这些事情:
- 在
myObject
中寻找toString
属性 myObject
中找不到toString
属性,故在myObject
的原型对象中寻找toString
- 其原型对象拥有这个属性,然后调用它。
⑤myObject
的原型是什么? 可以使用 Object.getPrototypeOf()
函数:
Object.getPrototypeOf(myObject); // Object { }
⑥有个对象叫 Object.prototype
,它是最基础的原型,所有对象默认都拥有它。Object.prototype
的原型是 null
,所以它位于原型链的终点。
⑦一个对象的原型并不总是 Object.prototype
:
const myDate = new Date();
let object = myDate;
do {
object = Object.getPrototypeOf(object);
console.log(object);
} while (object);
// Date.prototype
// Object { }
// null
这段代码创建了 Date
对象,然后遍历了它的原型链,记录并输出了原型。从中我们知道 myDate
的原型是 Date.prototype
对象,Date.prototype
的原型是 Object.prototype
。
例如:myDate.getMonth()
,是在 Date.prototype
上定义的方法调用的。