对象原型

您所在的位置:网站首页 图图的原型是谁 对象原型

对象原型

2023-10-17 03:26| 来源: 网络整理| 查看: 265

在浏览器控制台中,试着创建一个对象字面量:

js

const myObject = { city: "Madrid", greet() { console.log(`来自 ${this.city} 的问候`); }, }; myObject.greet(); // 来自 Madrid 的问候

这里有一个对象,它具有数据属性 city 和方法 greet()。如果你在控制台中输入对象的名称,然后跟随一个小数点(如同 myObject.),控制台会列出该对象可用的一系列属性。你会看到,除了 city 和 greet 外,还有很多其他属性!

__defineGetter__ __defineSetter__ __lookupGetter__ __lookupSetter__ __proto__ city constructor greet hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf

试着访问其中一个:

js

myObject.toString(); // "[object Object]"

它可以成功调用(即使你不知道 toString() 到底在做什么)。

这些额外的属性是什么,它们是从哪里来的?

JavaScript 中所有的对象都有一个内置属性,称为它的 prototype(原型)。它本身是一个对象,故原型对象也会有它自己的原型,逐渐构成了原型链。原型链终止于拥有 null 作为其原型的对象上。

备注: 指向对象原型的属性并不是 prototype。它的名字不是标准的,但实际上所有浏览器都使用 __proto__。访问对象原型的标准方法是 Object.getPrototypeOf()。

当你试图访问一个对象的属性时:如果在对象本身中找不到该属性,就会在原型中搜索该属性。如果仍然找不到该属性,那么就搜索原型的原型,以此类推,直到找到该属性,或者到达链的末端,在这种情况下,返回 undefined。

所以,在调用 myObject.toString() 时,浏览器做了这些事情:

在 myObject 中寻找 toString 属性 myObject 中找不到 toString 属性,故在 myObject 的原型对象中寻找 toString 其原型对象拥有这个属性,然后调用它。

myObject 的原型是什么?为了找到答案,我们可以使用 Object.getPrototypeOf() 函数:

js

Object.getPrototypeOf(myObject); // Object { }

有个对象叫 Object.prototype,它是最基础的原型,所有对象默认都拥有它。Object.prototype 的原型是 null,所以它位于原型链的终点:

一个对象的原型并不总是 Object.prototype,试试这段代码:

js

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。

实际上,如果调用了你所熟悉的方法(如 myDate2.getMonth()),是在 Date.prototype 上定义的方法调用的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3