我正在使用一个实用程序来在javascript中创建类。 它的工作原理,问题是如何定义私有属性。
这是代码
var OO = {
Class:function(){
var len = arguments.length;
var data = arguments[len-1];
var Klass;
if (data.constructor === Object){
Klass = function (){};
} else {
Klass = data.constructor;
delete data.constructor;
}
OO.extend(Klass.prototype,data); //Classic Extend Method
return Klass;
},
//Simple extend method, just what I need in this case
extend: function(target, source){
var prop;
for (prop in source)
target[prop] = source [prop];
}
}
这就是它的工作原理
// first create a class
var person = OO.Class ({
constructor: function (name, age) {
this.name = name;
this.age = age;
},
name:'',
age:'',
getName: function () {
return this.name;
},
getAge: function () {
return this.age;
}
});
这是实例
var one = new Person ('josh', 22);
问题是:
one.age / / returns 22
one.name / / returns josh
我需要的是这些属性只能通过getName()和getAge()等方法访问
EDIT1 :添加了扩展功能
答案 0 :(得分:1)
闭包是由构造函数params创建的,所以这就是你需要做的(编辑AlienWebguy的代码):
var Person = function(name, age){
this.getName = function() {
return name;
};
this.getAge = function() {
return age;
};
};
var john = new Person('johnathan', 33);
document.writeln(john.name); // undefined
document.writeln(john.age); // undefined
document.writeln(john.getName()); // johnathan
document.writeln(john.getAge()); // 33
答案 1 :(得分:0)
更新1:
这是工作原型。它适用于
1。)将建筑价值传递给私人会员。
Dummy values do work however.
测试小提琴:
答案 2 :(得分:-1)
作为对象界面一部分的任何变量(即this.x
和this.y
)都将是公开的。您将无法通过getter强制访问对这些变量的外部访问。
所以,只要你有这样的代码:
getAge: function () {
return this.age;
}
......你无法阻止这一点:
var one = new Person ('josh', 22);
console.log(one.age);
查看Douglas Crockford的文章Private Members in JavaScript。
答案 3 :(得分:-1)
如果您希望不要过于复杂化(并且完全放弃到目前为止所做的事情),正如@AlienWebguy建议的那样,您甚至不需要.io
成员 - 这最终会暴露出来与.name
和.age
属性一样多:
john.io.set('name', 'Johnny'); // still exposed!
最后,.io
对象与.name
和.age
属性一样公开,因此这是一个复杂的解决方案,在封装和信息隐藏方面没有任何进展。 (抱歉,@ AlienWebguy,这就是我的感受)
如果您正在尝试使用经典继承范例并完全抛弃传统的JavaScript OOP,那么就抛弃传统的函数 - 构造函数范例,而忘记在构造函数中使用this
引用:
// first create a constructor
var Person = function(arg0, arg1) {
var that = {};
// private variables
var age = arg0;
var name = arg1;
// public methods
that.getName = function() {
return name;
};
that.getAge = function() {
return age;
};
that.setAge = function(a) {
age = a;
};
return that;
};
var john = new Person('johnathan', 33);
console.log(john.name); // undefined
console.log(john.getName()); // 'johnathan'
console.log(john.age); // undefined
console.log(john.getAge()); // 33
john.setAge(28);
console.log(john.getAge()); // 28
john.setName("Richard"); // Error - setName is not a function
这是Douglas Crockford Parasitic Inheritance的一个例子......但是没有“继承”部分。关键是,实例变量age
和name
是私有的,但由于JavaScript的功能变量作用域而保持在范围内,因此对象的方法仍然可以操作它们。
您还会注意到name
变量没有设置器,因此这种技术合法地允许您控制对name
变量的访问 - 没有隐藏this.name
也不{ {1}}允许操作变量;它完全是私人的。