gpt4 book ai didi

javascript - 在 javascript 中创建对象

转载 作者:数据小太阳 更新时间:2023-10-29 05:11:18 26 4
gpt4 key购买 nike

只是为了好玩,我正在尝试在 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);

关于这个创作,我几乎没有什么问题。

  1. 我想创建一个对象,其中对象的特性/属性是私有(private)的并且对世界不可见。我这样做成功了吗?我真的不能访问对象属性吗?
  2. 有没有更好的方法来创建这种对象?
  3. 如果我想继承这个对象,我应该做一个newObject.prototype = roverObject这样行吗?最重要的是,这是否有意义。
  4. 最后我遇到了一个奇怪的问题。请注意对象“where”的最后一个方法,它返回一个连接的字符串。在这里,我尝试使用以下代码。

            newRover.where = function(){
    return "Rover :: "+ name +" is at Location("+xCord+","+yCord+") pointing to "+direction;
    }();

然后做了如下的console.log

console.log(rover1.where);
console.log(rover2.where);

它为我抛出以下错误:

cannot access optimized closure

为什么会这样说?我做错了什么?

感谢大家的帮助。任何评论意见也将不胜感激!干杯

最佳答案

Am I successful in doing that? Can I really not access the object attributes?

的确如此。你没有对象属性,你在 roverObject 中有局部变量功能。局部变量不能从外部访问,只能从 roverObject 内部的函数访问对它们有闭包的函数。

您正在调用 roverObject作为构造函数,使用 new roverObject , 无关紧要,因为您要从函数返回不同的对象。说var rover1= roverObject()没有 new会做同样的事情。值得注意的是 [new] roverObject 返回的对象是一个普通的 Object正如您从 {} 创建的一样; rover1 instanceof roverObjectfalse .

如果你想要instanceof工作,你必须调用new ,并使用 this而不是 newRover在构造函数中。

If I want to inherit this object, I should do a newObject.prototype = roverObject will that work? And will that make sense most of all.

没有。您目前没有制作原型(prototype)的余地。您正在为 roverObject 的每个实例使用每个方法的单独副本.您当然可以用这种方式制作对象,但这是一种不同于原型(prototype)制作的方法。如果你想制作类似 roverObject 的子类在你现在的安排中,你会说这样的话:

function AdvancedRover() {
var rover= new roverObject();
rover.doResearch= function() {
return rover.where()+' and is doing advanced research';
};
return rover;
}

请注意,由于基类构造函数中的“私有(private)”局部变量确实是私有(private)的,因此即使是子类也无法访问它们。没有“ protected ”。

newRover.where = function(){ ... }();

这是想做什么?我无法理解你的错误;以上所有操作都是将位置为 where 的字符串分配给(在调用 setter 方法之前,所以它充满了未定义)。

Is there a better way to create this kind of object?

也许吧。见this question用于讨论 JavaScript 中的类/实例策略。

关于javascript - 在 javascript 中创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1983955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com