这将是一个相对较长的问题,但我真的很想理解。最后的问题在问题的底部提出。
我已经阅读了这个问题的答案:
ES6 class variable alternatives
关于为什么在ES6中不接受这种语法的问题:
class MyClass {
const MY_CONST = 'string';
constructor(){
this.MY_CONST;
}
}
1)第一个答案提到:
请记住,类定义定义了原型方法 - 定义 原型上的变量通常不是你做的事情。
我不明白这一点;基于类的语言中的静态变量似乎与JS中原型上定义的属性具有相同的目的 显然不是像人名这样的实例变量,但它可以是车辆的默认MAX_SPEED,或者是所有实例共享的计数器。如果实例未覆盖原型的MAX_SPEED,则返回默认值。这不是静态变量的确切目的吗?
2)以下post(ES6规范提案)制定:
(故意)没有直接声明方式来定义 原型数据属性(方法除外)类属性,或 实例属性。 需要在外部创建类属性和原型数据属性 声明。
我没有看到在类本身(构造函数之外)中使用默认值声明/初始化实例/类变量的实际区别?如果它在原型上有什么关系?如果它涉及一个具有默认值的实例变量,该默认值可能适用于所有实例(但仍可覆盖),我看不出有什么问题。那究竟是什么意思呢?
3)问题ES6 class variable alternatives的第二个答案让我感到困惑(虽然不是技术专家)。
从类方法中可以访问变量
this.constructor.foo
(或MyClass.foo
)。通常无法访问这些类属性 类实例。即
MyClass.foo
给出'bar'但new MyClass().foo
是undefined
这表明很明显可以在这个例子中实现的类(或底层函数)上声明一个类变量:http://www.es6fiddle.net/iehn0hxp/
class Car{
constructor(){
//Set instance variable
this.instance_var = 220;
//Set class variable
this.constructor.class_var = 240;
}
}
var Mercedes = new Car();
var Audi = new Car();
//Instance property
console.log(Mercedes.instance_var); //220
//Class property
console.log(Car.class_var); //240
//Set instance property
Mercedes.instance_var = 120; //Well I don't know really :-)
console.log(Mercedes.instance_var); //120
//Class property
Car.class_var = 140;
console.log(Car.class_var); //140
//Can be accessed from the constructor property on the instance
console.log(Mercedes.constructor.class_var); //140
console.log(Audi.constructor.class_var); //140
所以最后 可以从类中声明一个静态属性;所以我没有看到在构造函数中声明它的区别是什么,而不仅仅是在类上定义它,而不是从外部定义它?最后,它似乎是一个简单的技术修改,将它放在构造函数中作为一个实际的类定义(结果将是相同的)。
仅提供方法才真正只是一种设计选择吗? 终极问题:
因为我不明白原型语言是如何改变的 在原型上拥有属性的哲学 类上的静态变量。对我来说看起来一样。
我希望我的问题很明确,如果没有,请大声喊叫。
答案 0 :(得分:5)
我不明白这一点;基于类的语言中的静态变量似乎与JS中原型上定义的属性具有相同的目的。
不,静态变量更像是在构造函数上定义的属性。原型上的变量将更接近到实例变量,但它们几乎没有用,因为它们是在实例之间共享的。 (因此,如果您修改原型上的可变属性,它将反映在该类型的所有其他实例中。)
我想这也回答了你的其他问题,但回顾一下:
原型上的变量与静态变量不同,因为它们似乎属于每个实例而不仅仅是类
原型上的变量与实例变量不同,因为类的每个实例都没有自己的变量实例
因此,原型上的变量没有那么有用,应该将它们分配给构造函数中的 (实例变量),或者将分配给构造函数(类变量)
它们也是属性,而不是变量
非ES6加糖的例子:
function Something() {
this.instanceProperty = 5;
}
Something.staticProperty = 32;
Something.prototype.prototypeProperty = 977;
var s = new Something();
console.log(s.instanceProperty); // 5
console.log(s.prototypeProperty); // 977? If you want a class property,
// this is not what you want
console.log(s.staticProperty); // undefined; it’s not on the instance
console.log(Something.staticProperty); // 32; rather, it’s on the class
console.log(Something.prototypeProperty); // undefined; this one isn’t