繁体   English   中英

ES6类/实例属性

[英]ES6 class / instance properties

这将是一个相对较长的问题,但我真的很想理解。 最后的问题在问题的底部提出。

我已经阅读了这个问题的答案:
ES6类可变替代品

关于为什么在ES6中不接受这种语法的问题:

class MyClass {
    const MY_CONST = 'string';
    constructor(){
        this.MY_CONST;
    }
}

1)第一个答案提到:

请记住,类定义定义了原型方法 - 在原型上定义变量通常不是你做的事情。

我不明白这个; 基于类的语言中的静态变量似乎与JS中原型上定义的属性具有相同的目的。
显然不是像人名这样的实例变量,但它可以是车辆的默认MAX_SPEED,或者是所有实例共享的计数器。 如果实例未覆盖原型的MAX_SPEED,则返回默认值。 这不是静态变量的确切目的吗?

2)以下帖子 (ES6规范提案)制定:

(故意)没有直接声明方式来定义原型数据属性(方法除外)类属性或实例属性。 需要在声明之外创建类属性和原型数据属性。

我没有看到在类本身(构造函数之外)中使用默认值声明/初始化实例/类变量的实际区别? 如果它在原型上有什么关系? 如果它涉及一个具有默认值的实例变量,该默认值可能适用于所有实例(但仍可覆盖),我看不出有什么问题。 那究竟是什么意思呢?

3)关于ES6类变量替代问题的第二个答案让我感到困惑(尽管不是技术专家)。

从一个类方法中,该变量可以作为this.constructor.foo (或MyClass.foo )访问。

通常无法从类实例访问这些类属性。 MyClass.foo给出'bar'但是new MyClass().fooundefined

这表明很明显可以在类(或底层函数)上声明一个类变量,如本例所示: 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 

那么到底有可能从类中声明静态属性; 所以我没有看到在构造函数中声明它的区别是什么,而不仅仅是在类上定义它,而不是从外部定义它? 最后,它似乎是一个简单的技术修改,将它放在构造函数中作为一个实际的类定义(结果将是相同的)。

仅仅提供方法,它真的只是一个设计选择吗?
终极问题:

因为我不明白原型语言是如何改变原型上的属性对类上的静态变量的理念。 对我来说看起来一样。

我希望我的问题很清楚,如果没有,请大声喊叫。

我不明白这个; 基于类的语言中的静态变量似乎与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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM