为什么我能够访问班级的私人成员?

时间:2016-06-23 16:36:11

标签: typescript angular angular2-template angular2-directives

我的代码如下

SELECT MIN(other.`Date`)
FROM (SELECT MAX(`Date`) AS mostRecent
      FROM foo) AS mostRecent
JOIN foo
  ON mostRecent.mostRecent = foo.`Date`
JOIN foo AS other
  ON other.Country = foo.Country
WHERE other.`Date` >= COALESCE(
                      (SELECT MAX(`Date`) 
                       FROM foo AS inside 
                       WHERE inside.Country <> foo.Country)
                      ,
                      (SELECT MIN(`Date`)
                       FROM foo AS i2
                       WHERE i2.Country = foo.Country)
                      )

为什么我能够在视图中显示名称并显示名称,前提是我已经为其提供了私有关键字

3 个答案:

答案 0 :(得分:2)

如果您尝试:

class A {
    private x: number;
}

let a = new A();
console.log(a.x);

code in playground

您将收到编译错误:

  

财产&#39; x&#39;是私人的,只能在课堂上访问&#39; A&#39;

我怀疑(因为我不是一个有角度的开发人员)你之所以没有得到这个,是因为你在字符串中有hero1.name因此打字稿编译器没有&将hero1视为变量。

我敢打赌,如果你尝试:

let obj = new heross("name", "details");
console.log(`heross.name: ${ obj.name }`);

然后您将收到编译错误 区别在于${}而不是{{}}

如果您不知道为什么可以在运行时访问它,那么因为javascript中没有可见性的概念,它没有通过编译器

修改

角度double curly brace{{ }})之间存在差异:

  

用于将表达式绑定到元素的双花括号符号{{}}   是内置的Angular标记

你不需要加入刻度线,你可以使用常规的单/双引号。

javascript template literals${ }):

  

模板文字是允许嵌入表达式的字符串文字。   您可以使用多行字符串和字符串插值功能   他们。他们被称为&#34;模板字符串&#34;在以前的版本中   ES2015 / ES6规范

更简单:

let x = 4;
console.log(`x={{ x }}`); // outputs 'x={{ x }}'
console.log(`x=${ x }`); // outputs 'x=4'

答案 1 :(得分:1)

通常在TypeScript中强制实施隐私,但仅通过静态工具进行检查。

您可以将视图和组件类中的绑定视为一个单元,就像模板中的绑定是类实现的一部分一样。

使用离线模板编译器,我认为这实际上是如何组织生成的代码。

答案 2 :(得分:0)

因为它在一天结束时是javascript。 Javascript语言没有private关键字。