2016-01-20 101 views
10

在构造函数和外部声明变量之间是否有区别?

对于函数,'this'的绑定方式不同,但对于变量,我无法弄清楚是否有区别。ES7类:在构造函数外声明属性

class Widget { 
    constructor(constructorName) { 
    this.constructorName = constructorName; 
    } 
    nonConstructorName = "nonConstructorName1"; 
} 



var myWidget = new Widget("myConstructorName1"); 

console.log(myWidget.constructorName); // "myConstructorName1" 
console.log(myWidget.nonConstructorName); // "nonConstructorName1" 

myWidget.constructorName = "myConstructorName2"; 
myWidget.nonConstructorName = "nonConstructorName2"; 

console.log(myWidget.constructorName); // "myConstructorName2" 
console.log(myWidget.nonConstructorName); // "nonConstructorName2" 

console.log(myWidget.prototype.constructorName); // "undefined" 
console.log(myWidget.prototype.nonConstructorName); // "undefined" 

console.log(myWidget.__proto__.constructorName); // "undefined" 
console.log(myWidget.__proto__.nonConstructorName); // "undefined" 

var myNewWidget = new Widget("myConstructorName3"); 

console.log(myNewWidget.nonConstructorName); // "nonConstructorName1" 
+0

**这是引用我的方案?** “有(故意)来定义或者原型的数据属性(比其他方法)类的属性,或实例属性没有直接声明的方式。” http://wiki.ecmascript.org/doku.php?id=strawman:maximally_minimal_classes –

+1

我不确定您是否可以按照您要定义的方式在类定义中包含属性。 在此基础上:https://babeljs.io/docs/learn-es2015/#classes在'constructor'方法之外没有属性定义,以及如果您尝试您的ES6代码:https:// babeljs。 io/repl /你会发现ES6的编译器会在'constructor'方法之外产生一个属性defnitition的错误。 –

+0

如果你喜欢在课堂外建造一些私人房屋,那么阅读这个问题也许很好:http://goo.gl/qzau3o有几个很好的答案。 –

回答

4

在评论回答@ merianos - 尼科斯...

“这里的方法是使用构造函数,这是私人的,存储私人数据的范围。对于方法有权访问这些私人数据,他们也必须在构造函数中创建,这意味着您要在每个实例中重新创建它们,这是一种性能和内存损失,但有些人认为这种惩罚是可以接受的。

Private properties in JavaScript ES6 classes

相关问题