Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 复制自己的对象而不是引用(更新帖子,不同Q) 解决方案_Javascript_Oop - Fatal编程技术网

Javascript 复制自己的对象而不是引用(更新帖子,不同Q) 解决方案

Javascript 复制自己的对象而不是引用(更新帖子,不同Q) 解决方案,javascript,oop,Javascript,Oop,我仍然掌握着窍门,对你们很多人来说,这很可能是合乎逻辑的。但我已经更新了这篇文章,告诉大家我是如何工作的,也许有人会通过搜索来这里 宣布: var test=Element({"id" : 1, "name" : "wrapper"}). append(Element({"id" : 2, "name" : "elm A"}), Element({"id" : 3, "name" : "elm b"}) ); alert(test.getInf

我仍然掌握着窍门,对你们很多人来说,这很可能是合乎逻辑的。但我已经更新了这篇文章,告诉大家我是如何工作的,也许有人会通过搜索来这里

宣布:

var test=Element({"id" : 1, "name" : "wrapper"}).
      append(Element({"id" : 2, "name" : "elm A"}),
             Element({"id" : 3, "name" : "elm b"})
      );

alert(test.getInfo("name"));
alert(test.aArguments["children"][1].getInfo("name"));
“类”:

var Element = function ($aPassArguments) {
    aArguments: {
            "id" : false,
            "name" : false,
            "type" : false,
            "title" : false, 
            "style" : false,
            "action" : [],
            "parent" : false,
            "children" : []
        };
    for (var prop in this.aArguments)
            if (prop in $aPassArguments) 
                this.aArguments[prop] = $aPassArguments[prop];
    return {
        append: function () {
            $argList = arguments;
            for ($i = 0; $i < $argList.length; $i++)
                if (typeof $argList[$i]=="string")
                    this.setChild(this.importDB($argList[$i],true));
                else
                    this.setChild($argList[$i]);
        },
         setChild: function($oChild) {
            this.aArguments["children"][this.aArguments["children"].length]=$oChild; 
        }
    };
};
现在我对它的用法很不满意,我希望它是一行,然后再次使用构造函数。这是可能的,而且。。。在更多的自学之后,我可能会解决这个问题。但现在我已经完成了:P刚刚用这个更新了我的帖子。当我再次访问它并有一个更好的声明时,我将再次更新它。也许有人会分享一种方法(更好的方法)来做到这一点。要最终拥有这样的东西:

var test=new Element({"id" : 3, "name" : "wrapper"})
           .append( new Element{"id" : 3, "name" : "elm A"}), 
                    new Element({"id" : 3, "name" : "elm B"}) 
                  );
var Element = {
    aArguments: {                                                       //set Default arguments
        "id" : false,
        "name" : false,
        "type" : false,
        "title" : false, 
        "style" : false,
        "action" : [],
        "parent" : false,
        "children" : {},
    },
    create:function ($aPassArguments) {
        for (var prop in this.aArguments)
            if (prop in $aPassArguments) 
                this.aArguments[prop] = $aPassArguments[prop];
        return this;
    },
    append: function () {
        $argList = arguments;
        for ($i = 0; $i < $argList.length-1; $i++)
            if (typeof $argList[$i]=="string")
                this.setChild(this.importDB($argList[$i],true));
            else
                this.setChild($argList[$i]);
        return this;
    },
    setChild: function($oChild) {
        this.aArguments["children"][this.aArguments["children"].length-1]=$oChild; 
    },
    getInfo: function($sKey) {
        return this.aArguments[$sKey];
    }
};
$set=(Element.create({"id": 1, "name" : "wrapper"})).
     append(Element.create({"id" : 3, "name" : "elm A"}));
alert($set.getInfo("name"));

旧职位 我在这里发牢骚,我搜索的关于javascript和对象的所有信息都告诉我同样的情况,这还不够,因为我不明白为什么下面的代码不能正常工作:

例如,我正在制作这样一个对象:

var test=new Element({"id" : 3, "name" : "wrapper"})
           .append( new Element{"id" : 3, "name" : "elm A"}), 
                    new Element({"id" : 3, "name" : "elm B"}) 
                  );
var Element = {
    aArguments: {                                                       //set Default arguments
        "id" : false,
        "name" : false,
        "type" : false,
        "title" : false, 
        "style" : false,
        "action" : [],
        "parent" : false,
        "children" : {},
    },
    create:function ($aPassArguments) {
        for (var prop in this.aArguments)
            if (prop in $aPassArguments) 
                this.aArguments[prop] = $aPassArguments[prop];
        return this;
    },
    append: function () {
        $argList = arguments;
        for ($i = 0; $i < $argList.length-1; $i++)
            if (typeof $argList[$i]=="string")
                this.setChild(this.importDB($argList[$i],true));
            else
                this.setChild($argList[$i]);
        return this;
    },
    setChild: function($oChild) {
        this.aArguments["children"][this.aArguments["children"].length-1]=$oChild; 
    },
    getInfo: function($sKey) {
        return this.aArguments[$sKey];
    }
};
$set=(Element.create({"id": 1, "name" : "wrapper"})).
     append(Element.create({"id" : 3, "name" : "elm A"}));
alert($set.getInfo("name"));
它会提醒我“榆树A”而不是“包装器”

我假设这是因为我没有创建元素的新对象,而是在处理同一个对象。现在对我来说,合乎逻辑的解决方案和起点是:

$set=(new Element.create({"id": 1, "name" : "wrapper"})).
     append(new Element.create({"id" : 3, "name" : "elm A"}));
alert($set.getInfo("name"));
但我得到了一个错误: TypeError:(中间值)。追加不是函数

为什么我的代码不能像我想象的那样工作? 有可能吗?如果有,我如何向对象添加构造函数?这样我就可以不打电话了。创建并使用:

 $set=new Element({"id": 1, "name" : "wrapper"}).
     append(new Element({"id" : 3, "name" : "elm A"}));

您是对的,您应该使用
new
操作符。除此之外,看起来你正在尝试制造某种类型的混合动力车。我建议如下

使用构造函数 包括创建对象时可以使用的可选配置

var Element = function (initialConfig) {
    if (initialConfig) {
        this.create(initialConfig);
    }
};
添加到原型中 您的所有共享
元素
成员都应该是

小心
您没有在循环中检查自己的属性,忽略了
{}
,我发现了至少一个隐含的全局属性。如果你不小心,JavaScript会咬你。考虑使用或帮助您发现这些问题。

< p>您的创建函数不创建任何对象,而是更改“<代码>元素”的位置。aArguments对象。任何奇怪的事情都可能随之而来。
无论如何,只需使用干净简单的原型继承方案,不要使用$,记住始终声明您的变量,并保持简单:

function Element(initialValues) {
    this.id = this.prototype.id++;
    this.name = null;
    this.type = null;
    this.title = null;
    this.style = null;
    this.action = [];
    this.parent = null;
    this.children = [];
    for (var prop in initialValues)
        if (this[prop] != undefined) this[prop] = initialValues[prop];
}

Element.prototype = {
    append: function () {
        for (var i = 0; i < arguments.length - 1; i++) {
            var thisElement = arguments[i];
            if (typeof thisElement == "string") this.setChild(this.importDB(thisElement, true));
            else this.setChild(thisElement);
        }
        return this;
    },
    setChild: function (child) {
        this.children.push(child);
        return this;
    },
    getInfo: function (key) {
        return this[Key];
    },
    id: 0
};
函数元素(初始值){
this.id=this.prototype.id++;
this.name=null;
this.type=null;
this.title=null;
this.style=null;
this.action=[];
this.parent=null;
这是:children=[];
for(初始值中的var prop)
如果(此[prop]!=未定义)此[prop]=初始值[prop];
}
Element.prototype={
追加:函数(){
for(var i=0;i
谢谢你帮我澄清了这一点:)我对编码有点生疏了,而且不熟悉javascript。顺便说一句,为什么不使用$?我习惯于用美元符号声明var。我现在就用谷歌搜索一下,但分享一下我的想法,Javascript中有很多陷阱,这就是为什么我更喜欢Dart,它同样兼容,但不那么复杂。如果你碰巧坚持使用js,找到你的设计风格并坚持下去,因为在js中总有10种方法可以做一些事情。快乐编码<代码>$仅适用于PHP$表示它是一个jQuery或Angular对象。您的示例没有按预期工作(它仍然向elm a发出警报,而不是包装器),但您的回答是有用的。不清楚您试图做什么。您可以编辑您的问题吗?
append
尝试添加子项,但您使用的是
this.aArguments[“children”].length-1
。对象上没有
length
属性,因此这会导致
NaN
。再次感谢@blud问题可能来自我自己的代码。你的例子很好。我需要解决我自己的问题,但如果你想知道的话。我想创建一个元素对象,它的元素对象是children。在我的示例编码中,我希望名称的警报为“wrapper”,因为这是父级,但它警报为“elma”,应该是子级。老实说,我不知道为什么我要写一个应该删除的“returnthisin.append”。但是当我这样做时,$set没有方法.getInfo。因此,简而言之:它似乎是.append覆盖了父元素。老实说@blud我还是搞不懂。示例中的结构更好,但结果仍然相同。“return this;”不应该出现在.append()和:“this.aArguments[“children”].length-1”不起作用,应该以不同的方式进行操作(我自己用谷歌搜索这一点是为了自学:P),但似乎.append(新元素…)覆盖了以前设置为$set的对象元素集。为什么会这样?我是我还是这看起来不合逻辑?(我给我一杯咖啡,因为它可能是我:P)
function Element(initialValues) {
    this.id = this.prototype.id++;
    this.name = null;
    this.type = null;
    this.title = null;
    this.style = null;
    this.action = [];
    this.parent = null;
    this.children = [];
    for (var prop in initialValues)
        if (this[prop] != undefined) this[prop] = initialValues[prop];
}

Element.prototype = {
    append: function () {
        for (var i = 0; i < arguments.length - 1; i++) {
            var thisElement = arguments[i];
            if (typeof thisElement == "string") this.setChild(this.importDB(thisElement, true));
            else this.setChild(thisElement);
        }
        return this;
    },
    setChild: function (child) {
        this.children.push(child);
        return this;
    },
    getInfo: function (key) {
        return this[Key];
    },
    id: 0
};