我正在使用框架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未定义?如何实现类,以便不能直接访问属性,而只能通过类提供的方法来访问?
答案 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