如何使Javascript类属性无法访问?

时间:2014-02-13 09:28:57

标签: javascript javascript-framework sapui5

我正在使用框架SAP UI5。我正在创建一个类的实例

// sap.m.Button是一个javascript类

var myButton = new sap.m.Button({text:"Hello"});
console.log(myButton.getText());             //Hello
console.log(myButton.getProperty('text');    //Hello
console.log(myButton.text);                  //undefined

为什么myButton.text未定义?如何实现类,以便不能直接访问属性,而只能通过类提供的方法来访问?

4 个答案:

答案 0 :(得分:2)

您可以通过执行此操作来隐藏对象的属性,例如

var button = function(opts){
  /* private data */
  var text = opts.text;

  this.getText = function(){
    return text;
  }
}

var bb = new button({ text: "Hello" });
// bb.text == undefined
// bb.getText() == "Hello"

答案 1 :(得分:1)

您在此处执行的操作是将对象传递给类sap.m.Button的构造函数。构造函数中该对象的作用取决于实现。它不一定要将它们添加到对象中。在这种情况下,它们可能存储在对象的局部变量中。构造函数可能看起来像这样:

sap.m.Button = function(properties) {
    var text = properties.text; // private variable only visible in the scope of the class

    this.getProperty(key) { // public function - as denoted by the prefix "this."
        if (key == 'text') {
            return text;  // returns the value of the private variable
        }
        // ... and more code for other properties ...
    }

    // ... and much more stuff ....
}

但您可以稍后将公共变量添加到对象:

var myButton = new sap.m.Button({text:"Hello"});
myButton.myVariable = "foo";
colsole.log(myButton.myVariable); // outputs "foo"

答案 2 :(得分:1)

它们更有可能将options变量存储为实例属性,并在构造函数的原型上定义方法。

function Button(opts){
     this.opts = opts;
}

Button.prototype = {
    constructor: Button,
    getText: function() { return this.opts.text; }
}

答案 3 :(得分:1)

托管对象的属性只能通过提供的mutator或访问者访问,例如getText,如果你真的想直接访问它们,请尝试

myButton.mProperties.text