0

在课堂上我需要做一些javascripting。我有一个任务来制作一个小脚本,我在其中制作一个对象。我现在的问题是我需要限制对象属性的可能值。这是我的代码:

var StudentObject = new Object();
var StudentStatus = new Object();
StudentStatus ={
   betaald:true,
   inschrijvingOK:true
}
StudentObject = {
   status: StudentStatus,
   traject: "",
   opleiding:"Toegepaste Informatica"
} 

在对象“StudentObject”中,您会看到一个属性“traject”。这应该只能包含“MBT”或“PBT”。有没有简单的方法?

提前致谢。

4

3 回答 3

2

正如您定义的那样,无法限制 javascript 中的公共对象属性可以包含哪些值。

除了属性本身,您还可以使用访问器方法来获取和设置值,并且这些方法只能强制执行某些值。然后,您可以将实际数据存储在闭包内的外部世界无法访问的地方,这样只有访问者才能访问它。如果您想将访问器与私有存储一起使用,请参阅http://javascript.crockford.com/private.html了解实现私有实例变量的方法。

function StudentObject(studentStatus, opleiding) {
   // private instance variable, only available to code defined
   // in the constructor
   var traject = "";

   // public methods
   this.setTraject = function(val) {
       if (val === "MBT" || val === "PBT") {
           traject = val;
       }
   }

   this.getTraject = function() {
       return traject;
   }

   this.status = studentStatus;
   this.opleiding = opleiding;
}

var studentStatus = {
    betaald:true,
    inschrijvingOK:true
}

var student = new StudentObject(studentStatus, "Toegepaste Informatica");
student.setTraject("PBT");
alert(student.getTraject());    // "PBT"
student.setTraject("xxx");
alert(student.getTraject());    // "PBT"
于 2013-10-16T07:18:44.420 回答
1

没有简单的方法可以做到这一点:(

您可能需要检查 setnewObject.defineProperty

代码:

function StudentObject() {
    var _traject = undefined;

    Object.defineProperties(this, {
        traject: {
            enumerable: true,
            configurable: true,
            get: function () {
                return _traject;
            },
            set: function (value) {
                if ((typeof (value) === "string") && (value.indexOf("MBT") >= 0 || value.indexOf("PBT") >= 0)) {
                    _traject = value;
                }
            }
        }
    });
}


var s = new StudentObject();
s.traject = "foobar"; // won't set traject to foobar
console.log(s.traject); // undefined
s.traject = "someTextContainsMBT"; // will set traject
console.log(s.traject); // someTextContainsMBT
于 2013-10-16T07:31:50.633 回答
1

你也许可以这样做:

traject:function(x){(x=='MBT'||x=='PBT')?return x:return null;}
于 2013-10-16T06:50:26.573 回答