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

时间:2015-12-18 08:24:14

标签: 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中的几乎每个类型都是一个对象,并且具有全局对象的原型。为什么我们不看最后两个原型属性?它是关于属性描述符还是什么?我只是假设它有一个简单的答案。

2 个答案:

答案 0 :(得分:2)

名为.prototype的属性仅是构造函数的属性。它存储在其他位置以用于实际的对象实例,并且无法在那里.prototype访问。

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

在某些较旧的浏览器中,您可以使用obj.__proto__进行访问。

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

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

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

答案 1 :(得分:1)

首先,你是对的,JavaScript中的每个数据结构都有自己的原型。但是,在语言语法级别中,只有函数具有prototype属性

其他人怎么样?那么你不能用属性键来做。你想到的实际上是一个内部的语言引擎。如果您阅读ECMAScript规范,您会在几个部分中注意到 [[Prototype]]

以前,有些浏览器会提供__proto__属性,这使您可以访问[[Prototype]],但它是供应商功能,而不是规范的一部分,因此不可靠。

现在在ES6中出现了一种用于此目的的新方法:Object.getPrototypeOf()

还有一件事,想想instanceof运营商。它实际上是将对象的__proto__与构造函数的prototype属性进行比较。