使用私有属性创建的类

时间:2012-09-06 22:42:39

标签: javascript oop

我正在使用一个实用程序来在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 :添加了扩展功能

4 个答案:

答案 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.

测试小提琴:

http://jsfiddle.net/UWRHP/11/

答案 2 :(得分:-1)

作为对象界面一部分的任何变量(即this.xthis.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的一个例子......但是没有“继承”部分。关键是,实例变量agename是私有的,但由于JavaScript的功能变量作用域而保持在范围内,因此对象的方法仍然可以操作它们。

您还会注意到name变量没有设置器,因此这种技术合法地允许您控制对name变量的访问 - 没有隐藏this.name也不{ {1}}允许操作变量;它完全是私人的。

相关问题