只是为了踢我试图在javascript中创建一个简单的数据对象.这是代码.
var roverObject = function(){
var newRover = {};
var name;
var xCord;
var ycord;
var direction;
newRover.setName = function(newName) {
name = newName;
};
newRover.getName = function() {
return name;
};
newRover.setDirection = function(newDirection) {
direction = newDirection;
};
newRover.getDirection = function() {
return direction;
};
newRover.setXCord = function(newXCord) {
xCord = newXCord;
};
newRover.getXCord = function() {
return xCord;
};
newRover.setYCord = function(newYCord) {
yCord = newYCord;
};
newRover.getYCord = function() {
return yCord;
};
newRover.where = function(){
return "Rover :: "+ name +" is at Location("+xCord+","+yCord+") pointing to "+direction;
};
return newRover;
};
rover1 = new roverObject();
rover2 = new roverObject();
rover1.setName("Mars Rover");
rover1.setDirection("NORTH");
rover1.setXCord(2);
rover1.setYCord(2);
console.log(rover1.where());
console.log(rover1);
rover2.setName("Moon Rover");
rover2.setDirection("SOUTH");
rover2.setXCord(1);
rover2.setYCord(1);
console.log(rover2.where());
console.log(rover2);
Run Code Online (Sandbox Code Playgroud)
关于这个创作我几乎没有问题.
newObject.prototype = roverObject遗嘱吗?这最有意义吗?最后我有一个奇怪的问题.注意objet"where"的最后一个方法,它返回一个连接的字符串.在这里,我尝试使用以下代码.
newRover.where = function(){
return "Rover :: "+ name +" is at Location("+xCord+","+yCord+") pointing to "+direction;
}();
Run Code Online (Sandbox Code Playgroud)然后执行了以下console.log
console.log(rover1.where);
console.log(rover2.where);
Run Code Online (Sandbox Code Playgroud)
它给我留下了以下错误:
cannot access optimized closure
Run Code Online (Sandbox Code Playgroud)
为什么会这么说?我究竟做错了什么?
谢谢你的帮助.任何评论意见也将不胜感激!干杯
我成功了吗?我真的不能访问对象属性吗?
确实.您没有对象属性,roverObject函数中有局部变量.局部变量不能从外部访问,只能从函数内部roverObject具有闭包的函数访问.
当你从函数返回一个不同的对象时,你roverObject作为构造函数调用new roverObject,是无关紧要的.var rover1= roverObject()没有new这样说会做同样的事情.值得注意的是,返回的对象[new] roverObject是Object您创建它时的平面{}; rover1 instanceof roverObject是false.
如果你想instanceof工作,你必须new使用,this而不是newRover在构造函数中使用.
如果我想继承这个对象,我应该做一个newObject.prototype = roverObject会有用吗?这最有意义吗?
不,您目前没有进行原型设计的补贴.您正在为每个实例使用每个方法的单独副本roverObject.你可以用这种方式做对象,但它与原型设计不同.如果你想roverObject在现有的安排中做类似于子类的东西,你会说:
function AdvancedRover() {
var rover= new roverObject();
rover.doResearch= function() {
return rover.where()+' and is doing advanced research';
};
return rover;
}
Run Code Online (Sandbox Code Playgroud)
请注意,因为基类构造函数中的"私有"局部变量确实是私有的,即使子类也无法获取它们.没有'受保护'.
newRover.where = function(){...}();
那是怎么回事?我无法得到你做的错误; 以上所做的就是将字符串赋值给where(在调用setter方法之前,所以它充满了未定义的).
有没有更好的方法来创建这种对象?
也许.有关JavaScript中类/实例策略的讨论,请参阅此问题.