<html>
<script>
function createClass(conf){
function _injectAttribute(fn){
var prototype = fn.prototype;
for(var publicName in publics){
if(!publics.hasOwnProperty(publicName))
continue;
if(typeof publics[publicName]=="function")
prototype[publicName] = function(publicName){
return function(){
return publics[publicName].apply(privates, arguments);
}
}(publicName);
else
prototype[publicName] = publics[publicName];
if(!privates[publicName])
privates[publicName] = prototype[publicName];
}
return fn;
}
var publics, privates;
publics = conf.publics;
privates = conf.privates || new Object();
var fn = function(fn){
return function(){
return fn.apply(privates, arguments);
};
}(conf.constructor || new Function());
return _injectAttribute(fn);
}
var MyClass = createClass({
constructor:function(){
console.log("constructor is called: " + this.message);
},
publics:{
message:"Hello, World",
sayJavaScript:function(){
return this._message;
},
sayABAP:function(msg){
return msg + ", " + this.ABAP();
}
},
privates:{
_message: "Hello, JavaScript",
ABAP :function(){
return "ABAP";
}
}
});
/*
var myClassInstance = new MyClass();
console.log(myClassInstance.message);
console.log(myClassInstance.sayJavaScript());
console.log(myClassInstance.sayABAP("Hello"));
console.log(myClassInstance._message);
console.log(myClassInstance.ABAP());
*/
class Developer {
constructor(name, language) {
this.workingLanguage = language;
let _name = name;
let _getName = function() {
return _name;
};
this.getName = _getName;
}
}
var Jerry = new Developer("Jerry", "Java");
var Ji = new Developer("Ji", "JavaScript");
console.log("Developer name: " + Jerry.getName());
console.log("Jerry's working language: " + Jerry.workingLanguage);
console.log("local function accessible? " + Jerry._getName);
console.log("Jerry's name: " + Jerry._name);
</script>
</html>