当我们在控制台上定义这些变量时:
var a = function(){} ;
var b = {} ;
var c = new a();
然后在控制台再次输入以下表达式:
a.prototype
// we have an a object with properties constructor and __proto__
b.prototype
// no result and why ? Isn t the prototype the Object
c.prototype
// no result here too.
所以我知道js中几乎每一种类型都是对象,都有全局对象的原型(prototype)。为什么我们看不到最后两个原型(prototype)属性?是关于属性描述符还是什么?我只是假设它有一个简单的答案。
名为.prototype
的属性只是构造函数的属性。它存储在其他地方以供实际对象实例使用,并且无法作为 .prototype
在那里访问。
在现代浏览器中,您可以使用Object.getPrototypeOf(obj)
来获取对象实例的原型(prototype)。参见 MDN了解详情。
在一些较旧的浏览器中,您可以使用 obj.__proto__
访问它。
在对象实例上访问原型(prototype)本身没有常见的原因。它应该是创建新对象的方法,访问它的地方是在构造函数上,因为它控制着如何创建新对象。它由 Javascript 在对象实例上内部使用,因此它存储在内部。如果您问为什么以这种方式设计基于原型(prototype)的语言,那您就问错人了——这正是基于原型(prototype)的系统设计的用途。
您应该与对象实例的实际属性值交互,而不是与原型(prototype)交互。访问原型(prototype)的中心位置是通过构造函数。存在一些通过更改现有实例的原型(prototype)来变形现有对象实例的特殊情况,但这不是基于原型(prototype)的编程中的常见设计范例。
在 C++ 中(它不是基于原型(prototype)的语言,但共享一些面向对象的概念),如果您想更改创建该类型的新对象的方式,则可以更改类定义。您不会更改类的一个实例并期望它会更改创建该类型的新对象的方式。