2

我正在尝试创建一个类常量,但我想我对 JavaScript 的新手级理解正在显示。当这段代码执行时:

var Class = function() {};
Class.prototype = { CONST : 1 };
var instance = new Class(),
c1 = instance.CONST,
c2 = Class.CONST;

结果是c1 === 1c2 === undefined。为什么不是c2 === 1?JavaScript 不查找原型链Class吗?

4

4 回答 4

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你声明的 via Class.prototype = { Const : 1 },然后它调用this.apply(that, arguments),它只是调用你声明的 Class 函数,并that用作this变量。然后它返回对象。您可以看到 Class 函数只是用作将事物填充到新生对象中的一种方式 create via new。并且只有创建的对象才能访问原型方法。

于 2012-08-30T02:47:37.043 回答
2

您正在尝试访问CONST构造函数 ( Class = function(){}) 的属性。CONST在您实例化之前将不可用Class

关于这个的几个很好的链接:

于 2012-08-30T02:21:45.743 回答
1

简单的答案是实例继承自其构造函数的公共原型,因此c1具有CONST继承自的属性Class.prototype(严格来说,它是实例的私有[[Prototype]]属性)。

另一方面,Classis 的一个实例Function,所以它继承自Function.prototype(即它的私有[[Prototype]]Function.prototype),not Class.prototype,所以它没有CONST属性。

对象的值[[Prototype]]是在构造时设置的,并且永远无法更改。用其他对象替换Class.prototype只会影响新实例。

请注意,在一些较旧的 Mozilla 浏览器(例如 Firefox)中,有一个__proto__引用对象的属性[[Prototype]]并且可以设置,但现在已弃用。

一般来说,最好不要谈论关于 javascript 的类,因为它推断只能在某种程度上模拟的行为和特性。

于 2012-08-30T04:29:16.097 回答
0

Class是一个函数对象。函数对象没有CONST属性。它用于构造一个“类”对象。“类”对象是具有CONST属性的自定义对象,因为它是在构造函数中声明的。

于 2012-08-30T02:31:27.543 回答