函数与对象的原型属性在控制台上的可见性

Fur*_*anO 5 javascript prototype function

当我们在控制台上定义这些变量时:

var a = function(){} ;
var b = {} ;
var c = new a();
Run Code Online (Sandbox Code Playgroud)

并在控制台上再次键入以下表达式:

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.
Run Code Online (Sandbox Code Playgroud)

所以我知道js中几乎每一个类型都是一个对象,并且都有全局对象的原型。为什么我们看不到最后两个原型属性?是关于属性描述符还是什么?我只是假设它有一个简单的答案。

jfr*_*d00 2

命名的属性.prototype只是构造函数的属性。它存储在其他地方作为实际对象实例,并且无法在.prototype那里访问。

在现代浏览器中,您可以使用Object.getPrototypeOf(obj)来获取对象实例的原型。有关详细信息,请参阅MDN

在一些较旧的浏览器中,您可以使用obj.__proto__.


没有常见的原因需要访问对象实例上的原型本身。它是创建新对象的配方,访问它的位置是在构造函数上,因为它控制新对象的创建方式。它由 Javascript 在对象实例内部使用,因此它是在内部存储的。如果您问为什么基于原型的语言是这样设计的,那么您就问错了人 - 这就是基于原型的系统的设计用途。

您应该与对象实例上的实际属性值交互,而不是与原型交互。访问原型的中心位置是通过构造函数。有一些特殊情况,通过更改现有实例的原型来变形现有对象实例,但这不是基于原型的编程中的常见设计范例。

在 C++(不是基于原型的语言,但共享一些面向对象的概念)中,如果要更改该类型的新对象的创建方式,则可以更改类定义。您不会更改类的一个实例并期望它会更改该类型的新对象的创建方式。

  • @Hacketo - 是的,但这不是实际对象使用的内容,并且 `.constructor` 属性可以设置为任何内容,而无需以任何方式更改对象的行为。而 `Object.getPrototypeOf(obj)` 直接进入对象的内部并获取活动对象正在使用的实际原型。 (2认同)

归档时间:

查看次数:

245 次

最近记录:

9 年,11 月 前