javascript原型共享

javascript原型共享,javascript,prototype,Javascript,Prototype,我想学习如何在javascript中使用prototype,我知道prototype可以帮助我在许多对象之间共享函数 var car = function(color, speed) { this.color = color; this.speed = speed; } car.prototype.doors = 4; var honda = new car('black', 'beep'); var kea = new car('black', 'meep'); documen

我想学习如何在javascript中使用prototype,我知道prototype可以帮助我在许多对象之间共享函数

var car = function(color, speed) {
    this.color = color;
    this.speed = speed;
}
car.prototype.doors = 4;
var honda = new car('black', 'beep');
var kea = new car('black', 'meep');
document.write(kea.doors+' '+ honda.doors);
honda.doors = 2;
document.write('<br/>');
document.write(kea.doors+' '+ honda.doors);
car.prototype.doors = 4;
document.write('<br/>');
document.write(kea.doors+' '+ honda.doors);
var car=功能(颜色、速度){
这个颜色=颜色;
速度=速度;
}
car.prototype.doors=4;
var honda=新车(“黑色”、“嘟嘟声”);
var kea=新车(“黑色”、“meep”);
文件。书写(kea.doors+“”+honda.doors);
honda.doors=2;
文件。写入(“
”); 文件。书写(kea.doors+“”+honda.doors); car.prototype.doors=4; 文件。写入(“
”); 文件。书写(kea.doors+“”+honda.doors);
我在这里看了一段视频:

这家伙说如果我更新原型的值,那么变量在我所有的对象中都会改变,但在我的示例中,当我改变它时,值没有改变。
如果我错了,请纠正我。

JavaScript对象是引用类型,而数字等原语则不是。所以你将使用副本。当您更改honda.doors的值时,您不会在其他任何地方更改它。要解决这个问题,您可以将
car.prototype.doors
作为对象放置,例如
car.prototype.doors={doors:4}

它们将仅针对未明确更改此属性的对象进行更改。我在最后一步更改了您的代码,设置了5个门:

car.prototype.doors = 5;

在这里,您可以看到kea对象的门数发生了变化,该对象继承了其原型的值,但是由于我们已明确更改了honda对象的此属性,因此其值没有更改。

您编写了一个类似于此的对象。如果打开chrome开发工具,您可以进行验证。当你寻找honda.doors时,它会在找到4之前找到2

car:{
    color: "black",
    doors: 2,
    speed:"beep",
    __proto__: {
        constructor: function(color, speed),
        doors:4,
        __proto__: {}
    }   
}

对@Ben answer的进一步添加(它们将仅对没有明确更改此属性的对象进行更改)这与delete相同,如果删除当前对象属性(delete honda.doors;),然后引用它,它将获取原型属性值。当当前对象没有该属性时调用Prototype,否则它总是引用本机属性值。我希望这有助于理解Prototype

考虑一下这段代码
var car=功能(颜色、速度){
这个颜色=颜色;
速度=速度;
}
car.prototype.doors=4;
var honda=新车(“黑色”、“嘟嘟声”);
var kea=新车(“黑色”、“meep”);
控制台日志(kea.doors+本田.doors);
honda.doors=2;
console.log(“
”); 控制台日志(kea.doors+本田.doors); car.prototype.doors=4; 删除honda.doors; console.log(“
”);
控制台日志(kea.doors+本田.doors)“当您更改honda.doors的值时,您不会在其他任何地方更改它。”我知道,但在视频中,这家伙说car.prototype.doors将更新每个对象内的所有doors变量,即使我没有在每个对象上手动执行此操作@Seif Eddine Slimene错误的信息,也许你应该在视频评论部分纠正他,请检查视频的最后一分钟,他明确地说,明确性改变的值和从构造函数原型继承的值将改变这两个,我只是想确认一下,在视频中,那个家伙说car.prototype.doors会更新每个对象中的所有doors变量,即使我没有在每个对象上手动更新!(他的意思也是显式更改的)基本上,当您尝试访问对象的值时,它首先检查该值是否直接设置为对象的属性。如果未设置,则会检查对象的原型。所以,当你更新prototype的值时,它只会影响没有为此属性设置自定义值的对象。请检查视频的最后一分钟,他明确地说,明确更改的值和从构造函数的原型继承的值都会更改这两个值,我只是想确认一下。他实际上删除了设置honda.doors=4的代码,然后设置了原型值。他想说的是,您不必直接修改对象来更改其值,您可以更改原型以全局应用更改,但他并不是说这些更改将应用于值已明确更改的对象。谢谢,这真的很有帮助:删除行“honda.doors=2”,然后查看