控制台上功能与对象的原型属性的可见性
这个问题在这里已经有了答案:
名为.prototype
的属性只是构造函数的一个属性。 它存储在其他地方用于实际的对象实例,并且不能以.prototype
访问。
在现代浏览器中,可以使用Object.getPrototypeOf(obj)
来获取对象实例的原型。 详情请参阅MDN。
在一些较旧的浏览器中,您可以使用obj.__proto__
来获得它。
在对象实例上访问原型本身没有共同的理由。 这意味着创建新对象的配方,访问它的位置在构造函数上,因为它控制着如何创建新对象。 它在Javascript内部由一个对象实例使用,因此它被内部存储。 如果你问为什么这样设计一个基于原型的语言,那么你问的是错误的人 - 这就是基于原型的系统是如何设计使用的。
您打算与对象实例上的实际属性值进行交互,而不是与原型进行交互。 访问原型的中心地点是通过构造函数。 通过改变现有实例的原型来变形现有对象实例有一些特殊情况,但这不是基于原型的编程中的常见设计范例。
在C ++中(它不是基于原型的语言,但共享一些面向对象的概念),如果要更改如何创建该类型的新对象,则需要更改类定义。 您不要更改某个类的一个实例,并期望它改变如何创建该类型的新对象。
首先,你是对的,JavaScript中的每个数据结构都有自己的原型。 但是,在语言语法层面上, 只有函数具有prototype
属性 。
那么别人呢? 那么你不能用财产关键。 你想到的其实是语言引擎的内部。 如果您阅读ECMAScript规范,您会注意到几个章节中的[[Prototype]] 。
以前,某些浏览器提供了一个__proto__
属性,它使您能够访问[[Prototype]],但它是一个供应商功能,而不是规范的一部分,因此不可靠。
现在在ES6中有一个用于这种目的的新方法: Object.getPrototypeOf()
。
还有一点,请考虑instanceof
操作符。 它实际上将对象的__proto__
与构造函数的prototype
属性进行比较。
上一篇: Visibility of prototype property of a function vs. object on console