javascript - 函数原型(prototype)属性与控制台上对象的可见性

标签 javascript function prototype

<分区>

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

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)的语言,但共享一些面向对象的概念),如果您想更改创建该类型的新对象的方式,则可以更改类定义。您不会更改类的一个实例并期望它会更改创建该类型的新对象的方式。

关于javascript - 函数原型(prototype)属性与控制台上对象的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34351299/

相关文章:

javascript - 对javascript中的原型(prototype)感到困惑

javascript - A.prototype = B.prototype 和 A.prototype = new B() 有什么区别?

javascript - 将 jQuery 插件与 React 集成

Chrome/Firefox 中的 Javascript 内存使用和调试(雷区)

javascript - 当鼠标悬停在选项上时,如何将 SELECT <OPTION> 标记的背景颜色从蓝色更改为灰色?

javascript - 使用 Jquery 进行 HTML 注入(inject)?

c - 函数初始化的双指针数组

javascript - 使用 javascript onclick 函数替换 div 内容不起作用

r - 在函数内使用 sfApply 时出现范围问题(包 Snowfall - R)

javascript - 为什么 Chrome 会将引用类型为 Date 的对象的原型(prototype)视为 "Object {}",而不是 "Date {}"?