call() 不适用于从函数构造函数创建的对象

call() not working for object created from function contructor

我在 JS 中创建了一个名为 House 的构造函数。

function House(color, floor, location){
    this.color = color;
    this.floor = floor;
    this.location = location;    
}

使用这个原型我又创建了两个对象,分别命名为 myHousemyOldHouse

var myHouse = new House('brick red', '1st floor', 'saltlake');
var myOldHouse = new House('Yellow', '2st floor', 'Koikhali');

然后我向 myHouse 对象添加了一个名为 address 的新方法。

myHouse.address = function(address){
   this.address = address;
   console.log('My address is '+this.address); 
}

现在我想使用调用函数将此方法添加到 myOldHouse 对象。

myHouse.address.call(myOldHouse, '2G');

但是当我调用 myOldHouse.address() 时,它显示错误。

我喜欢你的方法,这是传统方法。请使用 setAddress 或类似的东西。

错误: - 您不能在同一级别上使用同名的方法和变量。 调用您的 setter 函数 setAddress。 - 不要在对象(class 的实例)上附加新方法,直接在 class 上执行。 试试这个:

function House(color, floor, location) {
   
    this.color = color;
    this.floor = floor;
    this.location = location;    
    this.address = "";
}

Address = function( color, floor, location , address) {
   House.call(this, color, floor, location);
   this.address = address;
   console.log('My address is '+this.address + " color is: ", this.color); 
};

var myHouse = new Address('brick red', '1st floor', 'saltlake', "country1");
var myOldHouse = new Address('Yellow', '2st floor', 'Koikhali', "country2");

// myHouse.setAddress ('new address');

class 这种定义方式并不奇怪或愚蠢。你总是可以把你 class 放在一个文件中,以确保一切都清楚。

传统 class 定义将防止旧版本浏览器出现任何错误,并且仍然适用于所有现代网络导航器。

Call 在方法中调用时(在您的情况下为 address )只是告诉范围该方法应该 运行 。传递 myOldHouse 时,在地址方法中 this关键字指的是myOldHouse对象。所以现在 myOldHouse.address 必须打印出 '2G'。在您的情况下,您正在访问此处对象无法访问的方法。根本原因是方法 address 没有在两个对象之间共享,即 myHouse 和 myOldHouse。您已经从 House 函数创建了这些对象,这意味着这两个对象将可以访问与 House 关联的所有属性。在您的示例中,您已将 address 方法与 myHouse 相关联,这限制了它可以访问从 myHouse 函数创建的对象。

例如:

var myHouseChild = new myHouse(...);

现在,myHouseChild 对象将可以访问 HousemyHouse 函数的属性。

为了使 address 方法适用于 myOldHouse,您必须在 House 函数的原型中设置它,以便它在它的对象之间共享。

喜欢,House.prototype.address = () => {};

请参阅 this 答案以了解 new 关键字的内部工作原理。