我正在尝试创建一个类常量,但我想我对JavaScript的新手级别的理解正在显示。执行此代码时:
var Class = function() {};
Class.prototype = { CONST : 1 };
var instance = new Class(),
c1 = instance.CONST,
c2 = Class.CONST;
结果是c1 === 1
和c2 === undefined
。为什么不是c2 === 1
? JavaScript是否会查找Class
的原型链?
答案 0 :(得分:4)
你想要做的是用其他语言称为类静态方法 要在Javascript中执行此操作,您必须编写
Class.CONST = 1;
然后您可以使用Class.CONST;
如果您尝试使用new Class().CONST
等实例方法访问它,那么它将是未定义的
回到你的问题,Class.prototype中的所有东西只能被对象的一个实例访问(即通过new
创建),而不是Class本身。为什么?
考虑new
Function.method('new', function () {
var that = Object.create(this.prototype);
var other = this.apply(that, arguments);
return (typeof other === 'object' && other) || that;
});
首先Object.create(this.prototype)
创建一个全新的对象,该对象继承自this.prototype
,通过Class.prototype = { Const : 1 }
声明,然后调用this.apply(that, arguments)
,它只使用{调用您声明的类函数{1}}作为that
变量。然后它返回对象。您可以看到,Class函数只是用来通过this
将事物填充到新生对象中。并且只有创建的对象才能访问原型方法。
答案 1 :(得分:2)
您正在尝试访问构造函数(CONST
)的Class = function(){}
属性。在您实例化CONST
之前,Class
将无法使用。
关于此的一些好的链接:
答案 2 :(得分:1)
简单的答案是实例继承自其构造函数的公共原型,因此c1
具有继承自CONST
的{{1}}属性(严格来说,它是实例的私有Class.prototype
属性)。
另一方面,[[Prototype]]
是Class
的一个实例,因此它继承自Function
(即其私有Function.prototype
是[[Prototype]]
),而不是Function.prototype
,因此它没有Class.prototype
属性。
对象的CONST
的值在构造时设置,永远不能更改。用其他对象替换[[Prototype]]
只会影响新实例。
请注意,在一些较旧的Mozilla浏览器(例如Firefox)中,有__proto__
属性引用了对象的Class.prototype
并且可以设置,但现在已弃用。
一般来说,最好不要谈论关于javascript的类,因为它推断出只能在某种程度上模拟的行为和特征。
答案 3 :(得分:0)
Class
是一个函数对象。函数对象没有CONST
属性。它用于构造一个'Class'对象。 'Class'对象是具有CONST
属性的自定义对象,因为它在构造函数中声明。