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

Javascript 为什么原型需要通过实例访问?,javascript,class,instance,function-prototypes,Javascript,Class,Instance,Function Prototypes,我正试图创建一个类常量,但我想我对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?您试图访问构造函数的CO

我正试图创建一个类常量,但我想我对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

您试图访问构造函数的
CONST
属性(
Class=function(){}
)<代码>常量在实例化
之前不可用

关于这一点,有几个很好的链接:


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

    您试图做的是在其他语言中被称为类静态方法。
    要在Javascript中实现这一点,您必须编写

    Class.CONST=1
    然后可以使用
    Class.CONST调用它

    如果您尝试使用实例方法(如
    newclass().CONST
    )访问它,它将是未定义的

    回到您的问题,Class.prototype中的所有内容都只能访问对象的实例(即,通过
    new
    )而不是类本身。为什么?

    考虑实施
    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)
    创建一个全新的对象,该对象继承自您通过
    Class.prototype={Const:1}
    声明的
    this.prototype
    ,然后它调用
    this.apply(that,arguments)
    ,只需使用
    that
    作为
    this
    变量调用声明的类函数。然后返回对象。您可以看到,Class函数只是用来通过
    new
    将内容填充到新生成的对象create中。而且只有创建的对象可以访问原型方法。

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

    另一方面,
    函数
    的一个实例,因此它继承自
    函数。prototype
    (即它的私有
    [[prototype]]
    函数。prototype
    ),而不是
    类。prototype
    ,因此它没有
    常量
    属性

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

    请注意,在一些较旧的Mozilla浏览器(如Firefox)中,有一个属性引用了对象的
    [[Prototype]]]
    ,可以进行设置,但该属性现在已被弃用


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

    我没有足够的信心来回答这个问题,但我想说类没有原型链。。。这是一个构造函数。作为类实例的对象具有您使用
    Class.prototype=…
    创建的原型链。换句话说,
    Class.prototype
    不是指
    Class
    对象的原型链,而是指由
    Class
    构造函数创建的对象的原型链。@LarsH-我很确定函数对象有原型链。不过,你评论的第二部分澄清了很多事情。我把
    Class
    prototype
    属性和prototype链混淆了。Ted,我不否认函数对象有prototype链。。。只是A.prototype是对象A的原型链(我同意你的看法)好的。这就是让我困惑的地方。我有一种(显然是错误的)印象,分配给
    类。prototype
    就是为
    类设置prototype。因此,如果我没有弄错的话,
    prototype
    键在构造函数上设置时具有特殊的意义,但它与构造函数本身的原型链无关;它只是用来为实例建立原型链。我现在有吗?(另外,你不能简单地设置
    Class.CONST=1
    ——而不是设置一个返回1的函数——以获得一个“类常量”?)是的,javascript将只查找通过object.create()创建的对象的原型链,new对java程序员来说只是一种语法糖。Class.CONST=1很好,Class.Anything只需将任何内容附加到类对象上,最后一个链接非常有用。它清楚地表明构造函数的
    prototype
    属性与函数的原型链无关。MDN文档中似乎缺少这一小细节(我在发布问题之前已经阅读了这些文档)。