Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.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
使用call方法借用的方法与使用"=&引用;JavaScript中的运算符?_Javascript_Methods_Apply - Fatal编程技术网

使用call方法借用的方法与使用"=&引用;JavaScript中的运算符?

使用call方法借用的方法与使用"=&引用;JavaScript中的运算符?,javascript,methods,apply,Javascript,Methods,Apply,考虑以下对象 var person1 = { name: 'Sam', age: 26, job: 'teacher', testMethod : function() { //do something } }; var person2 = { name: 'John', age: 30, job: 'student' }; 我想从person1向person2借用testMethod //Using = operator perso

考虑以下对象

var person1 = {
   name: 'Sam',
   age: 26,
   job: 'teacher',
   testMethod : function() {
     //do something
   }
};

var person2 = {
   name: 'John',
   age: 30,
   job: 'student'
};
我想从person1向person2借用testMethod

//Using = operator
person2.testMethod = person1.testMethod;
person2.testMethod();

//Using call method
person1.testMethod.call(person2)

这两种借用方式有什么区别?

调用
方法不会将
testMethod
添加到第二个对象
person2
,它只会更改
这个
testMethod
主体内的绑定,因此,它将指向
person2,而不是
this
指向
person1

例如:

来自MDN:

call()允许调用属于一个对象的函数/方法 为不同的对象分配和调用

call()向函数/方法提供此函数的新值。具有 call(),可以编写一次方法,然后在另一个方法中继承它 对象,而不必重写新对象的方法


如果您的函数没有使用person1的任何内部值,那么就没有问题,或者如果person1和person2的结构相同,那么就没有问题。@CodeManiac,如果是=,是否会在内存中创建方法定义的单独副本?不会,它只会创建引用,它可以是access
person2.testMethod
和call method,在
person2
上不创建引用。第一个版本为
person2
添加了一个新属性,不是吗?
var person1 = {
  firstName:"John",
  lastName: "Doe",
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
}
var person2 = {
  firstName:"Mary",
  lastName: "Doe"
}

person1.fullName(); //this will yield John Doe
person1.fullName.call(person2); //this will yield Mary Doe

person2.fullName = person1.fullName;
person2.fullName(); //this will yield also Mary Doe