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



我在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对象添加了一个名为地址的新方法。

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

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

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

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

在方法中调用时(address在您的情况下(Call只是告诉方法应该运行的范围。传递 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 = (( => {};

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

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

错误: - 您不能在同一级别上拥有具有相同名称的方法和变量。 调用你的 setter 函数 setAddress。 - 不要在对象(类的实例(上附加新方法,而是直接在类上附加新方法。 试试这个:

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');

这种阶级定义方式并不奇怪或愚蠢。您始终可以将类放在单个文件中,以确保所有内容都清楚。

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

最新更新