javascript中的对象创建

Pri*_*ank 6 javascript oop

只是为了踢我试图在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)

关于这个创作我几乎没有问题.

  1. 我想创建一个对象,其中对象的属性/属性是私有的,对世界不可见.我成功了吗?我真的不能访问对象属性吗?
  2. 有没有更好的方法来创建这种对象?
  3. 如果我想继承这个对象,我应该做一个有意义的newObject.prototype = roverObject遗嘱吗?这最有意义吗?
  4. 最后我有一个奇怪的问题.注意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)

为什么会这么说?我究竟做错了什么?

谢谢你的帮助.任何评论意见也将不胜感激!干杯

bob*_*nce 6

我成功了吗?我真的不能访问对象属性吗?

确实.您没有对象属性,roverObject函数中有局部变量.局部变量不能从外部访问,只能从函数内部roverObject具有闭包的函数访问.

当你从函数返回一个不同的对象时,你roverObject作为构造函数调用new roverObject,是无关紧要的.var rover1= roverObject()没有new这样说会做同样的事情.值得注意的是,返回的对象[new] roverObjectObject您创建它时的平面{}; rover1 instanceof roverObjectfalse.

如果你想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中类/实例策略的讨论,请参阅此问题.