Javascript 为什么原型需要通过实例访问?
我正试图创建一个类常量,但我想我对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
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文档中似乎缺少这一小细节(我在发布问题之前已经阅读了这些文档)。