为什么需要通过实例访问原型?

时间:2012-08-30 02:19:36

标签: javascript class instance function-prototypes

我正在尝试创建一个类常量,但我想我对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 个答案:

答案 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属性的自定义对象,因为它在构造函数中声明。