Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/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 JS类方法_Javascript_Class_Oop_Methods_Reference - Fatal编程技术网

用于更改从另一个方法作为参数发送的属性值的JavaScript JS类方法

用于更改从另一个方法作为参数发送的属性值的JavaScript JS类方法,javascript,class,oop,methods,reference,Javascript,Class,Oop,Methods,Reference,到目前为止,我对JavaScript的了解是,传递给函数的参数是按值传递的,但值本身是引用。让我们看一下以下示例: function change(obj){ obj.x = 10; } var myObj = {x: 5}; console.log(myObj); //Object {x: 5} change(myObj); console.log(myObj); //Object {x: 10} 假设我们有以下课程: var myClass = (function(

到目前为止,我对JavaScript的了解是,传递给函数的参数是按值传递的,但值本身是引用。让我们看一下以下示例:

function change(obj){
    obj.x = 10;
}

var myObj = {x: 5};
console.log(myObj);    //Object {x: 5}

change(myObj);
console.log(myObj);    //Object {x: 10}
假设我们有以下课程:

var myClass = (function(){
    function myClass(){
         this.x = 5;
    }

    myClass.prototype.changeX = function(val){
         this.x = val;
    }

    return myClass;
})();

var myObj = new myClass();
console.log(myObj);    //myClass {x: 5}

myObj.changeX(10);
console.log(myObj);    //myClass {x: 10}
到目前为止一切看起来都很好。让我们扩展我们的课程:

var myClass = (function(){
    function myClass(){
         this.x = 5;
    }

    myClass.prototype.changeX = function(prop, val){
         prop = val;
    }

    myClass.prototype.changer = function(){
         this.changeX(this.x, 10);
    }

    return myClass;
})();

var myObj = new myClass();
console.log(myObj);    //myClass {x: 5}

myObj.changer();
console.log(myObj);    //myClass {x: 5}

那么,为什么在最新的示例中,
myObj
x
属性没有更改呢?如何修改最新示例的
changer
方法,使其通过发送
this.x
和要作为参数分配给它的值来调用
changeX
方法?

当传入一个基元类型(如数字/字符串)时,该值是按值传入的,但当传入一个对象/数组/函数时,这是通过参考。您传入的是对象的属性,而不是对象本身

var myClass = (function(){
    function myClass(){
         this.x = 5;
    }

    myClass.prototype.changeX = function(prop, val){
         prop.x = val;
    }

    myClass.prototype.changer = function(){
         this.changeX(this, 10); //Pass the object, not the object property
    }

    return myClass;
})();

var myObj = new myClass();
console.log(myObj);    //myClass {x: 5}

myObj.changer();
console.log(myObj);    //myClass {x: 10}
按值:

  • 空的
  • 未定义
  • 布尔值
通过引用:

  • 反对
  • 排列
  • 作用

prop
成为函数上下文中变量的表示形式。它实际上没有设置为
this.x
,您只是通过引用传递
this.x
的值。原语通过值传递,而对象通过“引用副本”传递。这是可能的。现在这是有意义的。非常感谢。