使用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,如果是=,是否会在内存中创建方法定义的单独副本?不会,它只会创建引用,它可以是accessperson2.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